タイトル画面の実装
タイトル画面周辺の画面構成を、以下に示します。
ストーリーボードでは以下の設定が行われています。
タイトル画面は、初期画面としてモバイルアプリ起動時に表示されます。
タイトル画面の "Login" ボタンと "Register" ボタンに設定されたセグエにより、ログイン画面とユーザー登録画面に遷移します。
各画面は、図中に示したビューコントローラークラスに関連付けられています。
ソースコードは以下のとおりです。
Swift
Objective-C
- TitleViewController.h / TitleViewController.m
- LoginViewController.h / LoginViewController.m
- RegisterViewController.h / RegisterViewController.m
タイトル画面
モバイルアプリが起動されると、タイトル画面を実装している TitleViewController
クラスが初期化されます。
ビューの読み込みの完了時には、以下に示す viewDidLoad()
メソッドが呼び出されます。
-
override func viewDidLoad() { super.viewDidLoad() // If the user has been logged in, show the data listing screen. KiiUser.authenticate(storedCredentials: { (user :KiiUser?, error : Error?) -> Void in if error != nil { // Show the title screen. return; } // Show the data listing screen. let app = UIApplication.shared.delegate! as! AppDelegate app.showBalanceList() }) }
-
- (void)viewDidLoad { [super viewDidLoad]; // If the user has been logged in, show the data listing screen. [KiiUser authenticateWithStoredCredentials:^(KiiUser *user, NSError *error) { if (error != nil) { // Show the title screen. return; } // Show the data listing screen. AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate]; [app showBalanceList]; }]; }
viewDidLoad()
メソッドでは、ユーザーのログイン状態の復元と、ログイン状態に基づいた画面切り替えを行います。
ここでは、KiiUser
クラスの authenticate(storedCredentials:)
メソッドを呼び出してログイン情報を復元しています。Kii Cloud SDK では、ユーザーのログインやリフレッシュが成功したときに、SDK が内部に持つ認証関連の情報をキーチェーンに自動的に保存しており、その情報から認証関連の情報を復元できます。
復元に失敗した場合、Kii Cloud SDK は前回保存したユーザー情報が利用できないことを意味します。この場合は、タイトル画面にとどまってログインをやり直します。
復元に成功した場合は、ユーザーはログイン済みの状態となっています。ユーザーによるログイン操作は省略できるため、
AppDelegate
に実装したshowBalanceList()
メソッドを呼び出して、すぐにデータ一覧画面に遷移します。
なお、authenticate(storedCredentials:)
メソッドのコールバックの user
引数はユーザー情報のフルセットを持っていない点にご注意ください。ログイン情報の復元処理は、Kii Cloud にアクセスせず、キーチェーンに保存されている最小限の情報から user
を生成します。ユーザー属性などの詳細情報にアクセスするには、ユーザーのリフレッシュを行う必要があります。詳細は、このページの最後 より詳しく学びたい方へ をご覧ください。
保存情報とアクセストークン
authenticate(storedCredentials:)
メソッドを使うと、前回ログインに成功したときの情報をキーチェーンから復元できます。
保存している情報には、ユーザー ID やユーザー名などの様々なものがありますが、特に重要なものはアクセストークンです。アクセストークンは、認証済みのユーザーを識別するための文字列です。
アクセストークンは Kii Cloud の利用において基本となる概念で、使用する機会が多いため、以下に詳細な説明を示します。
モバイルアプリは Kii Cloud SDK を通して Kii Cloud にアクセスしています。SDK から Kii Cloud へのリクエストは、REST API として公開されている API 仕様に基づいて行われます。
ユーザー名とパスワードによってユーザーがログインすると、そのユーザーの権限でアクセスするアクセストークンが Kii Cloud から発行されます。
後続の REST API のリクエストでは、HTTPS のヘッダーにアクセストークンを指定します。これにより、操作元のユーザーが特定され、そのユーザーの権限で処理を行うことができます。
実際のモバイルアプリでも、Kii Balance と同様、authenticate(storedCredentials:)
メソッドを使ってアクセストークンを含むログイン状態を復元できます。ただし、より低レベルな API として、アクセストークンだけを使ったログインもサポートしています。ログイン成功時にアクセストークンを文字列としてどこかに保存しておき、KiiUser
クラスの authenticate(withToken:andBlock:)
メソッドでログインすることもできます。
ログイン画面とユーザー登録画面
タイトル画面で "Login" ボタンまたは "Register" ボタンがタップされると、ログイン画面またはユーザー登録画面に遷移します。
これらの画面は、LoginViewController
クラスと RegisterViewController
クラスで実装されていますが、KiiUser の操作に使用する Kii Cloud SDK の API が異なるだけで、実装は基本的に同じです。
Kii Cloud SDK の呼び出し方法は、Hello Kii で説明したコードと同じです。ユーザー名 username
とパスワード password
を引数にしてノンブロッキング API を呼び出します。呼び出し方法の詳細は、Hello Kii の ログイン画面の実装 を参照してください。
ログイン
-
@IBAction func loginClicked(_ sender: Any) { // Get a username and password. let username = self.usernameText.text! let password = self.passwordText.text! self.closeKeyboard() // Show the progress. let progress = KiiProgress.create(message:"Login...") self.present(progress, animated: false, completion: nil) // Log in the user. KiiUser.authenticate(username, withPassword: password) { (user, error) -> Void in if error != nil { progress.dismiss(animated: true, completion: { let description = (error! as NSError).userInfo["description"] as! String let alert = KiiAlert.create(title: "Error", message: description) self.present(alert, animated: true, completion: nil) }) return } progress.dismiss(animated: false, completion: nil) let app = UIApplication.shared.delegate as! AppDelegate app.showBalanceList() } }
-
- (IBAction)loginClicked:(id)sender { // Get a username and password. NSString *username = self.usernameText.text; NSString *password = self.passwordText.text; [self closeKeyboard]; // Show the progress. UIAlertController *progress = [KiiProgress createWithMessage:@"Login..."]; [self presentViewController:progress animated:NO completion:nil]; // Log in the user. [KiiUser authenticate:username withPassword:password andBlock:^(KiiUser *user, NSError *error) { if (error != nil) { [progress dismissViewControllerAnimated:YES completion:^{ UIAlertController *alert = [KiiAlert createWithTitle:@"Error" andMessage:error.description]; [self presentViewController:alert animated:YES completion:nil]; }]; return; } [progress dismissViewControllerAnimated:YES completion:nil]; AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate]; [app showBalanceList]; }]; }
ユーザー登録
-
@IBAction func registerClicked(_ sender: Any) { // Get a username and password. let username = self.usernameText.text! let password = self.passwordText.text! self.closeKeyboard() // Show the progress. let progress = KiiProgress.create(message:"Registering...") self.present(progress, animated: false, completion: nil) // Register the user. let user = KiiUser(username: username, andPassword: password) user.performRegistration { (user :KiiUser?, error : Error?) -> Void in if error != nil { progress.dismiss(animated: true, completion: { let description = (error! as NSError).userInfo["description"] as! String let alert = KiiAlert.create(title: "Error", message: description) self.present(alert, animated: true, completion: nil) }) return } progress.dismiss(animated: false, completion: nil) let app = UIApplication.shared.delegate as! AppDelegate app.showBalanceList() } }
-
- (IBAction)registerClicked:(id)sender { // Get a username and password. NSString *username = self.usernameText.text; NSString *password = self.passwordText.text; [self closeKeyboard]; // Show the progress. UIAlertController *alert = [KiiProgress createWithMessage:@"Registering..."]; [self presentViewController:alert animated:NO completion:nil]; // Register the user. KiiUser *user = [KiiUser userWithUsername:username andPassword:password]; [user performRegistrationWithBlock:^(KiiUser *user, NSError *error) { if (error != nil) { [alert dismissViewControllerAnimated:YES completion:^{ UIAlertController *alert = [KiiAlert createWithTitle:@"Error" andMessage:error.description]; [self presentViewController:alert animated:YES completion:nil]; }]; return; } [alert dismissViewControllerAnimated:YES completion:nil]; AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate]; [app showBalanceList]; }]; }
成功時は AppDelegate
に実装されている showBalanceList()
メソッドを呼び出し、データ一覧画面に遷移します。
失敗時は画面遷移を行わないため、認証情報を再入力できます。
Kii Balance では、KiiProgress
クラスによる進捗表示と、KiiAlert
クラスによるメッセージ表示を行っています。どちらも iOS SDK の UIAlertController
クラスを使用して画面表示を行っています。表示と消去は iOS SDK の基本どおりですが、エラー表示を行う際には KiiProgress
インスタンスの非表示処理の完了を通知するコールバックで、KiiAlert
の初期化を行っている点にご注意ください。
なお、Kii Cloud SDK for iOS には、Android 版に存在するユーザー名とパスワードの 妥当性チェック の API が実装されていません。独自のチェック処理を実装するか、上記のようにユーザー登録またはログインの API を実際に実行してみる必要があります。
次は...
データ一覧画面でのデータ取得の方法について説明します。
データ一覧の取得 に移動してください。
より詳しく学びたい方へ
- ここで説明した保存情報からのログインの詳細は、SDK による保存情報からのログイン を参照してください。
- アクセストークンを指定したログインの方法は、アクセストークンの指定によるログイン を参照してください。