タイトル画面周辺の画面構成を、以下に示します。
ストーリーボードでは以下の設定が行われています。
タイトル画面は、初期画面としてモバイルアプリ起動時に表示されます。
タイトル画面の "Login" ボタンと "Register" ボタンに設定されたセグエにより、ログイン画面とユーザー登録画面に遷移します。
各画面は、図中に示したビューコントローラークラスに関連付けられています。
ソースコードは以下のとおりです。
Swift
Objective-C
タイトル画面
モバイルアプリが起動されると、タイトル画面を実装している 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 を実際に実行してみる必要があります。
次は...
データ一覧画面でのデータ取得の方法について説明します。
データ一覧の取得 に移動してください。
より詳しく学びたい方へ