forceios ネイティブアプリケーションについて
学習の目的
この単元を完了すると、次のことができるようになります。
- iOS ネイティブ Salesforce アプリケーションの全体的なフローを理解する。
- アプリケーション起動中のイベントのフローを理解する。
-
AppDelegate
とSceneDelegate
で実行のフローを制御する方法を理解する。
一緒にトレイルを進みましょう
エキスパートと一緒にこの手順を進めますか? 次の動画をご覧ください。これは「Trail Together」(一緒にトレイル) シリーズの一部です。
(この動画は 14:49 の時点から始まります。戻して手順の最初から見直す場合はご注意ください。)
アプリケーションフローの概要
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 のログインと認証を実行する
- アプリケーションを起動する
Mobile SDK の初期化方法は、開発言語によって異なります。
SDK マネージャーを使用するコードのほとんどは、新しい forceios アプリケーションに存在します。このコードを詳しく見てみましょう。
- Xcode で、AppDelegate.swift ファイルを開きます。
-
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 のオフライン機能の設定ファイルをインポートする。
- アプリケーションの最初のカスタムビューにウィンドウのルートビューを設定する。
ソースコードを見て、アプリケーションがそのビューをどう表示するかを確認しましょう。
- Xcode で、SceneDelegate.swift ファイルを開きます。
- クラスの上のほうに、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()
については後ほど説明します。 - 「func initializeAppViewState」を検索します。このメソッドの実装の最後から 2 番目の行を確認します。
self.window?.rootViewController = InitialViewController(nibName: nil, bundle: nil)
このコードはself.window?.rootViewController
プロパティを新たに作成されたInitialViewController
オブジェクトに設定します。InitialViewController
クラスはアプリケーションに定義されており、希少で特筆すべきことはありません。このビューは最初に表示されますが、Salesforce ログイン画面と認証画面のコンテナにすぎません。これについて知っておくべきことはそれだけです。このメソッドはsceneWillEnterForeground
イベントハンドラーからコールされます。 - 「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 リソースにアクセスします。ただし、ここからはアプリケーションのフロー、コンテンツ、インテントをすべてあなたが決定できます。創造力を発揮しましょう。
リソース