タイトル画面の実装

タイトル画面周辺の画面構成を、以下に示します。

ストーリーボードでは以下の設定が行われています。

  • タイトル画面は、初期画面としてモバイルアプリ起動時に表示されます。

  • タイトル画面の "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 を実際に実行してみる必要があります。


次は...

データ一覧画面でのデータ取得の方法について説明します。

データ一覧の取得 に移動してください。

より詳しく学びたい方へ