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

学習の目的

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

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

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

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

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

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

すべての iOS アプリケーションと同様に、Mobile SDK ネイティブアプリケーションはメインのイベントループを設定する定型のメインモジュールから始まります。Xcode がこのファイルを生成し、ほとんどのユーザはこのファイルに触れることはありません。 

iOS 13 用の Mobile SDK テンプレートアプリケーションは、カスタマイズ可能な次のクラスも定義します。

  • AppDelegate クラスは Mobile SDK の初期化を処理します。
  • SceneDelegate クラスはシーンのライフサイクルイベントとユーザ認証を処理します。このクラスは共有 SDK マネージャオブジェクトに従って Salesforce パスコードと認証タスクを調整します。認証に成功すると、制御がアプリケーションのルートビューコントローラに渡されます。
  • InitialViewController クラスは Salesforce ログイン画面のコンテナです。
  • ルートビューコントローラは、アプリケーションのコンテンツを開始するカスタムクラスです。

次の図は、最も包括的な SDK マネージャ MobileSyncSDKManager を使用するネイティブアプリケーションの起動フローを示します。このマネージャは認証を有効にします。Mobile SDK のオフライン機能も対象になります。

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

デフォルトで、forceios ネイティブアプリケーションは SalesforceManager の特殊なサブクラスである MobileSyncSDKManager を使用して Mobile SDK を初期化します。このクラスは、すべての Mobile SDK 機能を有効にします。

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

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

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

Mobile SDK の初期化方法は、開発言語によって異なります。

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

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

ここで、initializeSDK() をコールして Mobile SDK を初期化する MobileSyncSDKManager オブジェクトを確認できます。 

override init() {
    super.init()
    MobileSyncSDKManager.initializeSDK()
}

このメソッドは内部で MobileSyncSDKManager というクラス名を SalesforceManager という「スーパー」(または親) クラスに渡します。SalesforceManager は舞台裏で、アプリケーションの起動やライフサイクルイベント (ユーザ認証、PIN コードの失敗、フォアグラウンドの状態など) のオブザーバーを設定します。極端な場合を除き、これらのイベントに直接関与することはありません。 

SalesforceManager はさらに 2 つの顕著なアクションを実行します。 

  • アプリケーションのライフサイクルの残りの期間にわたって持続する、それ自体の共有インスタンスを作成する。
  • SDK マネージャのタスクを実行する MobileSyncSDKManager のインスタンスを常に取得するようにそれ自体を設定する。

その結果、アプリケーションが SDK マネージャのメソッドをコールするときに、MobileSyncSDKManager がそのメソッドの動作をカスタマイズすることが可能になります。 

そして、こうした変更がコーディングに影響します。コードは常にこの 1 つの共有インスタンスで SDKマネージャのメソッドをコールする必要があります。 

MobileSyncSDKManager.shared

後ほどこの例を示します。その前に、アプリケーションの新しい AppDelegate クラスを詳しく見てみましょう。

AppDelegate クラス

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

  • 新しいシーンセッションをカスタマイズする。独自のシーンセッション設定を指定するには、application(_:configurationForConnecting:options:) メソッドの戻り値をカスタマイズします。
  • 顧客がシーンセッションを破棄したときにリソースをクリーンアップする。application(_:didDiscardSceneSessions:) メソッドを使用して、破棄されたシーンに追加されていたカスタムリソースを解放する。
  • アプリケーションをプッシュ通知に登録する。application(_:didFinishLaunchingWithOptions:) メソッドのコメント付きの指示に従います。iOS の Mobile SDK プッシュ通知には、復号化を処理する拡張が必要です。一例として、SalesforceMobileSDK-Templates GitHub レポジトリの iOSNativeSwiftEncryptedNotificationsTemplate を参照してください。
  • 顧客のデバイスをプッシュ通知に登録する。プッシュ通知に登録すると、application(_:didRegisterForRemoteNotificationsWithDeviceToken:) コールバックメソッドによってデバイストークンが渡されます。このデバイストークンを Mobile SDK と Salesforce プッシュ通知マネージャに登録する場合は、コメント付きの指示に従います。
  • プッシュ通知の登録に失敗した場合に通知する。時として、アプリケーションがプッシュ通知に登録しようとして失敗することがあります。その場合、application(_:didFailToRegisterForRemoteNotificationsWithError:) メソッドでエラーメッセージを受け取ります。このメッセージは好きなように処理できます。
  • IDP サービスを有効にする。このアプリケーションを他の Mobile SDK アプリケーションの ID プロバイダとして使用する予定の場合は、まず application(openURL:options:) メソッドのコメント付きの指示に従います。この機能を完全に実装するには、『Mobile SDK 開発ガイド』の説明に従ってアプリケーションを設定します。

SceneDelegate クラス

SceneDelegate クラスはアプリケーションの出発点です。Salesforce ログインを開始し、制御をカスタムコンテンツに渡します。けれども、それだけではありません。

iOS 13 以降用の Swift アプリケーションでは、SceneDelegate が SwiftUI ビューのマネージャとして中心的な役割を果たします。SceneDelegate は次のようなシーンのライフサイクルイベントを処理します。 

  • アプリケーションへの接続
  • フォアグラウンドやバックグラウンドの入力
  • 有効/無効の切り替え
  • サイズ変更

SceneDelegate クラスをカスタマイズして、これらのイベントの独自の処理を追加できます。実際のところ、テンプレートアプリケーションを使用すれば、操作方法を指示するコメントが主要なイベントハンドラに示されるため簡単に追加できます。

Mobile SDK において SceneDelegate はカスタムリソースを管理する場所です。テンプレートアプリケーションでは、次の処理を行うために SceneDelegate が使用されます。 

  • 必要に応じて (ユーザがログインする前やユーザがログアウトするときに)、Salesforce ログイン画面を表示する。
  • 現在のユーザがログアウトしたときにビューの状態をリセットする。
  • SmartStore や Mobile Sync のオフライン機能の設定ファイルをインポートする。
  • アプリケーションの最初のカスタムビューにウインドウのルートビューを設定する。

ソースコードを見て、アプリケーションがそのビューをどう表示するかを確認しましょう。

  1. Xcode で、SceneDelegate.swift ファイルを開きます。
  2. クラスの上のほうに、1 つ目の関数定義があります。
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        self.window = UIWindow(frame: windowScene.coordinateSpace.bounds)
        self.window?.windowScene = windowScene
        AuthHelper.registerBlock(forCurrentUserChangeNotifications: {
            self.resetViewState {
                self.setupRootViewController()
            } 
        })
    }
    初期化中のすべてのシーンで最初に停止するのがこのメソッドです。最初の 3 行は定型コードで、シーンをアプリケーションに「接続」します。つまり、シーンをアプリケーションウィンドウにアタッチして表示されるようにします。このメソッドの最後のステートメントは、現在のユーザの変更通知を処理するように Mobile SDK の AuthHelper クラスを設定します。ハンドラ自体は AuthHelper.registerBlock(__:) メソッドコール内の内部ブロックで、resetViewState(_:)setupRootViewController() の 2 つのカスタム非公開メソッドをコールします。resetViewState(_:) メソッドは、既存のビューステートを停止して元のルートビューを復元するという方法で、アプリケーションを元の初期状態に戻します。setupRootViewController() については後ほど説明します。
  3. 「func initializeAppViewState」を検索します。このメソッドの実装の最後から 2 番目の行を確認します。
    self.window?.rootViewController = InitialViewController(nibName: nil, bundle: nil)
    このコードは self.window?.rootViewController プロパティを新たに作成された InitialViewController オブジェクトに設定します。InitialViewController クラスはアプリケーションに定義されており、希少で特筆すべきことはありません。このビューは最初に表示されますが、Salesforce ログイン画面と認証画面のコンテナにすぎません。これについて知っておくべきことはそれだけです。このメソッドは sceneWillEnterForeground イベントハンドラからコールされます。
  4. 「func setupRootViewController」を検索します。次のように実装されています。
    func setupRootViewController() {
        // Setup store based on config userstore.json
        MobileSyncSDKManager.shared.setupUserStoreFromDefaultConfig()
        // Setup syncs based on config usersyncs.json
        MobileSyncSDKManager.shared.setupUserSyncsFromDefaultConfig()
        self.window?.rootViewController = UIHostingController(
            rootView: AccountsListView()
        )
    }

setupRootViewController() メソッドは、次の 2 つの重要な設定手順を実行します。

  • SmartStore や Mobile Sync のオフライン機能の設定ファイルを読み込む。
  • ウィンドウのルートビューコントローラを AccountsListView に設定する。このビューは、ユーザの組織の取引先名のリストを表示するカスタム SwiftUI ビューです。

ルートビューコントローラは、アプリケーションのコンテンツの出発点です。iOS にこの選択を明確に示すために、setupRootViewController()UIHostingController オブジェクトを作成し、その rootView プロパティをアプリケーションの最初のビューのインスタンスに初期化します。この処理が行われたときに、アプリケーションの制御がカスタムコードに渡されます。テンプレートアプリケーションのビュークラスやモデルクラスを再利用することも、独自のソリューションに置き換えることもできます。次のセクションで説明するとおり、引き続き Mobile SDK API をコールして Salesforce リソースにアクセスします。ただし、ここからはアプリケーションのフロー、コンテンツ、インテントをすべてあなたが決定できます。創造力を発揮しましょう。 

リソース

無料で学習を続けましょう!
続けるにはアカウントにサインアップしてください。
サインアップすると次のような機能が利用できるようになります。
  • 各自のキャリア目標に合わせてパーソナライズされたおすすめが表示される
  • ハンズオン Challenge やテストでスキルを練習できる
  • 進捗状況を追跡して上司と共有できる
  • メンターやキャリアチャンスと繋がることができる