進行状況の追跡を始めよう
Trailhead のホーム
Trailhead のホーム

forceios ネイティブアプリケーションについて

学習の目的

この単元を完了すると、次のことができるようになります。

  • ネイティブ iOS Salesforce アプリケーションの全体的なフローを理解する。
  • アプリケーション起動中のイベントのフローを理解する。
  • ルートビューコントローラが実行のフローを制御する方法を理解する。

アプリケーションフローの概要

iOS ネイティブアプリケーションを詳しく見てみましょう。

一見すると、Mobile SDK ネイティブアプリケーションは典型的な iOS アプリケーションでしかありません。そのアーキテクチャは Model-View-Controller (MVC) 用語で次のように表すことができます。

  • モデルは、Lightning Platform データベーススキーマです。
  • ビューは、プロジェクト内の nib ファイルおよび実装ファイルから取得されます。
  • コントローラ機能は、iOS Cocoa Touch クラス、Salesforce Mobile SDK コントローラクラス、アプリケーションのカスタムコントローラクラスの形式で適用されます。

すべての iOS アプリケーションと同様に、Mobile SDK ネイティブアプリケーションはメインのイベントループを設定する定型のメインモジュールから始まります。Xcode がこのファイルを生成し、ほとんどのユーザはこのファイルに触れることはありません。iOS 用の Mobile SDK テンプレートアプリケーションは、カスタマイズ可能な 3 つのクラスも定義します。

AppDelegate
Mobile SDK の初期化とユーザ認証を処理します。認証が成功したら、制御を RootViewController に渡します。
InitialViewController
Salesforce ログイン画面のコンテナ
RootViewController
アプリケーションのエントリポイント

AppDelegate は共有 SDK マネージャオブジェクトに従って Salesforce パスコードと認証タスクを調整します。次の図は、最も基本的な SDK マネージャ SalesforceSDKManager を使用するネイティブアプリケーションの起動フローを示します。

アプリケーションフローの図

デフォルトでは、forceios ネイティブアプリケーションが SmartSyncSDKManager を Sync マネージャクラスとして使用します。このクラスは、すべての Mobile SDK 機能を有効にします。

アプリケーション起動フロー

顧客がアプリケーションを開くと、かなり複雑な一連のイベントが発生します。これらのイベントには次のようなものがあります。

  • アプリケーションの設定を適用する
  • アプリケーションのパスコードを検証する (省略可能)
  • Salesforce のログインと認証を実行する
  • Salesforce Mobile SDK とアプリケーションを起動する
かなりの自由度 (たとえば、Salesforce ログインを起動後まで遅延可能) があることが、これらのイベントの処理を難しくすることがあります。幸い、Mobile SDK では SDK マネージャオブジェクトが提供されるため、これらの処理に煩わされることはありません。このオブジェクトによって適切なブートストラップシーケンスが適用されるため、ほとんどの起動イベントは心配する必要がありません。

Mobile SDK の初期化方法は、開発言語によって異なります。ネイティブの Mobile SDK アプリケーションは、SalesforceManager Swift クラスの特殊なサブクラスである SmartSyncSDKManager を使用します。

SDK マネージャを使用するコードのほとんどは、新しい forceios アプリケーションにすでに存在します。このコードを詳しく見てみましょう。

  1. Xcode で、AppDelegate.swift ファイルを開きます。
  2. init メソッドまでスクロールします。

ここで、Mobile SDK を初期化するアプリケーションを確認できます。たとえば、Swift アプリケーションで、SmartSyncSDKManager オブジェクトの initializeSDK() をコールします。内部でこのアプリケーションは、ユーザ認証、PIN コードの失敗、その他のエラー状態の起動イベントのハンドラを設定します。極端な場合を除き、これらのイベントに直接関与することはありません。

Mobile SDK が初期化された後、init メソッドが認証ヘルパークラスをコールして、現在のユーザがログアウトしたときの処理を定義します。基本的に、このヘルパークラスはビューをリセットして、アプリケーションを再起動します。

AppDelegate クラスの残りは、必要に応じてカスタマイズ可能な、UIApplicationDelegate プロトコルメソッドを実装します。これらのメソッドにはそれぞれ、目的の使用事例で具体的に何をすべきかを説明するコメント付きの指示が含まれます。たとえば、次のような処理を実行できます。

ナビゲーションバーをカスタマイズします。
application(_:didFinishLaunchingWithOptions:) メソッドのコメント付きの指示に従います。
アプリケーションを転送通知に登録します。
application(_:didFinishLaunchingWithOptions:) メソッドのコメント付きの指示に従います。
顧客のデバイスを転送通知に登録します。
転送通知に登録すると、application(_:didRegisterForRemoteNotificationsWithDeviceToken:) コールバックメソッドによってデバイストークンが渡されます。このデバイストークンを Mobile SDK と Salesforce 転送通知マネージャに登録する場合は、コメント付きの指示に従います。
転送通知の登録に失敗した場合の通知
時として、アプリケーションが転送通知に登録しようとして失敗することがあります。application(_:didFailToRegisterForRemoteNotificationsWithError:) メソッドでエラーメッセージを受け取ります。このメッセージは好きなように処理できます。
IDP サービスの有効化
このアプリケーションを 他の Mobile SDK アプリケーションの ID プロバイダサービスとして使用する予定の場合は、application(openURL:options:) メソッドのコメント付きの指示に従って、IDP サービスを有効にできます。この機能を完全に実装するには、『Mobile SDK 開発ガイド』の説明に従ってアプリケーションを設定します。

AppDelegate クラスと RootViewController クラス

AppDelegate は、ある意味、アプリケーションの Mobile SDK コントロールセンターです。少なくともそのローンチパッドと言えます。アプリケーションの初期化とログインを処理し、その後で実行の制御をルートビューに渡します。ソースコードを見て、アプリケーションがそのビューをどう表示するかを確認しましょう。

  1. Xcode で、AppDelegate.swift ファイルを開きます。
  2. 「initializeAppViewState」を検索します。
    インスタンスメソッドの実装がわかりましたか? メソッドの最後から 2 番目の行を見てください。
    self.window!.rootViewController = InitialViewController(nibName: nil, bundle: nil)

    このコードでは self.window.rootViewController プロパティを新しく作成された InitialViewController オブジェクトに設定しています。InitialViewController クラスはアプリケーションに定義されており、最小限で特筆すべきことはありません。このビューは、最初に表示されますが、Salesforce ログイン画面のコンテナとして機能します。これについて知っておくべきことはそれだけです。

  3. 「setupRootViewController」を検索します。
    一致した場所をすべて見ると、次のことがわかります。
    • AppDelegateinit メソッドでコールされている。
    • 次のように実装されている。
      func setupRootViewController()
      {
          let rootVC = RootViewController(nibName: nil, bundle: nil)
          let navVC = UINavigationController(rootViewController: rootVC)
          self.window!.rootViewController = navVC
      }

setupRootViewController インスタンスメソッドで、AppDelegateRootViewController インスタンスをアプリケーションの実際の最初のビューとして作成します。「RootViewController」という名前の利便性に気付きましたか? これは、アプリケーションのウィンドウの rootViewController プロパティと非常によく似ています。偶然の一致でしょうか? そうではなさそうです。ただし、この名前は利便性のためだけに付けられており、要件ではありません。実際には、そのクラス名が気に入らなければ、Xcode のリファクタリングツールを使用してこのアプリケーションで名前を変更できます。

ルートビューコントローラは、アプリケーションの UI の出発点です。ただし、rootViewController プロパティに割り当てられる前に、UINavigationController オブジェクトでラップされています。このラッパーを使用すると、簡単に他のビューを追加してビュー間を移動できます。UINavigationControllerRootViewController で初期化されているため、RootViewController は常に UI スタックの最下部にあります。

RootViewController クラスは他に何を行うのでしょうか? テーブルビューを設定します。これは、UITableViewController を継承するクラスでは標準的な動作です。RootViewController は、SalesforceRestAPI 共有インスタンスも使用して Salesforce REST API 要求と応答を処理します。最初に、UITableViewController の動作を見てみましょう。

UITableViewController クラス

ユーザがアプリケーションを使用して Salesforce にログインしたら、SDK マネージャが RootViewController をルートビューコントローラとして設定します。最初に、このクラスがアプリケーションのメインビューをどうカスタマイズするかを見てみましょう。

RootViewControllerUITableViewController クラスを継承します。これにより、自動的にテーブルビューが与えられます。RootViewController は UI 詳細に軽微なカスタマイズを加え、実行時に Salesforce データをその tableView プロパティに読み込みます。ただし、通常は親クラスが表示を処理します。

RootViewController がテーブル表示をカスタマイズする方法を確認する手順は、次のとおりです。
  1. Xcode で RootViewController.swift を開きます。
  2. 次のメソッドまでスクロールします。
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
このメソッドで最も興味深いスニペットは、セルの表示ラベルを最近の REST 応答からの値に設定する 2 行のシーケンスです。
// Configure the cell to show the data.
let obj = dataRows[indexPath.row]
cell!.textLabel!.text = obj["Name"] as? String
この「dataRows」配列とは何で、いつ登場したのか疑問に思ったかもしれません。次の単元では、RootViewController クラスが REST 要求および応答も処理することを学習します。たとえば、このクラスは、REST 要求から Salesforce レコードを取り込むように dataRows を設定します。ここで、tableView(_:, cellForRowAt:) メソッドのコードが、各セルのテキスト表示ラベルを dataRows 配列からの名前値に設定します。また、1 対 1 の対応を実現するために、コードでは現在のセルの行番号 (indexPath.row) を配列インデックスとして使用します。
retargeting