オリジナル記事
Salesforce Mobile SDKの新バージョンの提供開始をお知らせします。Mobile SDK 9.0は、開発者とエンドユーザの生産性に重点を置いています。構築するアプリケーションがiOS向け、Android向け、クロスプラットフォーム向けのいずれであろうと、皆様にもエンドユーザにもこのリリースでの機能強化に満足していただけると思います。
マルチタスク処理を行うエンドユーザは、iPadOSでの複数のウィンドウのサポートに大喜びすることでしょう。異なるアカウント、レコード、ユースケースを並べて管理できます。
皆様の意見に耳を傾けてきました。開発者からのフィードバックにもとづき、親/子情報の同期再開後のレコードの重複をなくすために外部IDを追加しました。これを自身でコーディングする必要はありません。皆様に代わってこちらで行いました。
さらに、ハイライトはオープンソースのパワーです。コミュニティの貢献に助けを得て、React Native向けのTypeScriptを組み込みました。現在、React Nativeの開発者は、TypeScriptのデバッグおよびエラー検出機能を早期および多くの場合モバイルアプリケーション開発中に活用できます。
Salesforce Mobile SDKの導入が今回初めてなら、Trailheadにアクセスし、「Mobile SDKを使用した開発」トレイルを確認して今すぐ始めてください。
SDK for iOSおよびSDK for Androidのリリースノートで、このリリースでのすべての変更を確認することもできます。
リリースのハイライト
- iOS向けSDK
- iPadOSでの複数ウィンドウのサポート
- iOSデバイスでのランドケープの改善
- React Native向けSDK
- React Native向けのTypeScript
- 最新化されたテンプレート
- 全般
- 親/子の同期更新のための外部ID
- OSおよびライブラリ更新
iOS向けSDK
SalesforceとAppleの連携によって効果が高まります。ベストオブブリードのAppleハードウェア、最新のMobile SDK機能、Salesforceの世界トップクラスのCRMを活用して、効果的なカスタマーエクスペリエンスを実現します。このリリースで、Mobile SDKは、Apple iOS 14およびiPadOS 14の機能を完全にサポートし、複数ウィンドウのサポートを追加し、画面の向きがランドスケープの場合の改善を行うことで、Appleとのパートナーシップを強化します。アプリケーションを最新リリースにアップグレードして、iOS 14およびiPadOS 14機能を活用してください。
SalesforceおよびApple iOS向けの開発の詳細については、iOSアプリケーション開発の開始を参照してください。
Apple iOS 14
Mobile SDK 8.3以降、Apple iOS 14のすべての新機能を活用できます。アプリケーションクリップ、ウィジェット、拡張現実などを作成できます。開発者向けのApple iOS 14機能について詳しくは、こちらを参照してください。
OSおよびライブラリ更新
iOSベースSDKは現在(13ではなく)14です。最小バージョンは12ではなく13です。
Apple iPadOS 14
Mobile SDK 9.0以降、Apple iPadOS、特にiPadOS 14の新機能を活用できます。最新のMobile SDKでは、開発者は、iPad向けの機能を構築するときにコピー/貼り付け、マルチタスク処理、分割ビューなどの機能を活用できます。アプリケーションへの追加変更は一切不要です。
iPadOSアプリケーションに複数ウィンドウサポートを追加するには、Mobile SDK 9.0の新しいメソッドを使用する必要があります。次のセクションで詳しく説明します。開発者向けのApple iPadOS機能について詳しくは、こちらを参照してください。
iPadOSでの複数ウィンドウのサポート
Appleは、iOS 13からiPadでの複数ウィンドウのサポートを追加しました。つまり、単一のアプリケーションで、2つのウィンドウを並べて実行し、各ウィンドウで独自の処理を行うことができます。
Mobile SDK 9.0では、iPadOSアプリケーション向けの複数ウィンドウのサポートを提供するようになりました。この機能をアプリケーションで有効化することで、エンドユーザの生産性を高めることができます。たとえば、エンドユーザは、2つの異なるレコードを同時に操作し、一方のウィンドウから他方のウィンドウへコピー/貼り付けすることができます。マルチタスク処理のメリットは無限です。
Apple iOSにはシーンという概念があります。これが最終的に複数ウィンドウ機能を有効にします。各シーンは、一意の識別子を持つシーンセッションと関連付けられています。このセクションでは、”ウィンドウ”機能を”シーン”と呼びます。
この機能を新規または既存のMobile SDKアプリケーションで実装するには、開発者は新しいメソッドを使用してログインフローを適切に管理する必要があります。残りはMobile SDKが対応します。
iPadOS向けの複数ウィンドウの詳細については、こちらを参照してください。
ログイン
エンドユーザのログインフローは非常にシンプルです。アプリケーションは、ユーザがどの場所でもまだ一度も認証していない場合、ログイン画面を表示します。エンドユーザがあるシーンでログインを成功させたら、Mobile SDKは、これをすべてのシーンに適用し、各シーンのログイン完了ブロックをトリガします。あるシーンからのログアウトもすべてのシーンに適用されます。この例を以下の画像で確認できます。
SFSDKAuthHelperは、ログインフローを実行するための標準かつ推奨方法を提供します。このクラスは、シーンパラメーターを取り入れる新しいメソッドによって強化されています。開発者は、これらの新しいメソッドを使用して、ログインフロー内の複数のシーンを適切に管理する必要があります。
さらに、RestAPIExplorerは、これらのメソッドを使用するシーンデリゲートを備えるようになりました。
以下の例は、2つのメソッドの使用を示しています。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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: scene) { self.resetViewState { self.setupRootViewController() } } self.initializeAppViewState() AuthHelper.loginIfRequired(scene) { self.setupRootViewController() } } |
IDP
IDPで高度認証を使用する場合、シーンデリゲートには、アプリケーションデリゲートと同様のURLを開くためのメソッドがあります。したがって、複数のシーンを持つIDPクライアントアプリケーションは、シーンデリゲートを使用し、シーンの永続的な識別子を渡す必要があります。以下のコードは、この例を示しています。
1
2 3 4 5 |
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let urlContext = URLContexts.first { UserAccountManager.shared.handleIdentityProviderResponse(from: urlContext.url, with: [UserAccountManager.IDPSceneKey: scene.session.persistentIdentifier]) } } |
SFSDKAuthHelperの新しいメソッド
説明したように、SFSDKAuthHelperにはシーンサポートのための新しいメソッドが4つあります。これらを使用して、複数のシーンに対してログインフローを適切に管理する必要があります。
- (*void*)loginIfRequired:(UIScene *)scene completion:(*nullable* *void* (^)(*void*))completionBlock;
- ユーザがまだSalesforceにログインしておらず、かつ、アプリケーション設定の’shouldAuthenticate’フラグがfalseに設定されている場合、ログインフローを開始します。
- (*void*)handleLogout:(UIScene *)scene completion:(*nullable* *void* (^)(*void*))completionBlock;
- シーンでのユーザの切り替えまたはログイン画面の提示を処理します。
- (*void*)registerBlockForCurrentUserChangeNotifications:(UIScene *)scene completion:(*void* (^)(*void*))completionBlock;
- 通知時に特定のシーンのログアウトフローをトリガし、ユーザの切り替え時に実行するようにブロックを登録します。
- (*void*)registerBlockForLogoutNotifications:(UIScene *)scene completion:(*void* (^)(*void*))completionBlock;
- 通知時に特定のシーンのログアウトフローをトリガします。
これらのメソッドの使用方法について詳しくは、Mobile SDK Developers Guideを参照してください。
XCodeプロジェクト設定での有効化
上記のメソッドに加え、XCodeでアプリケーションのプロジェクト設定を更新する必要があります。アプリケーションは、[Deployment Info(リリース情報)]セクションのアプリケーションターゲットの全般設定を通じて複数のシーンを有効化します。
既知の制限
アプリケーションに対して複数のシーンを有効化する際に注意すべきいくつかの制限があります。
- アプリケーションパスコードは、現時点では複数のウィンドウでサポートされていないため、アプリケーションがパスコードを使用する場合は、複数のウィンドウを有効化すべきではありません。
- ログインのシンプルさに関する制限として、ユーザは、あるシーンでサンドボックス環境にログインし、別のシーンで本番環境にログインすることはできません。
iOSデバイスでのランドケープの改善
Mobile SDKは、以前からランドスケープモードをサポートしてきました。ただし、お客様から、エンドユーザがiPhoneまたはiPadが予期せずにポートレートモードに切り替わる状況を経験しているというフィードバックがありました。ログインは、ポートレートへの切り替えが発生する状況の一例です。
Mobile SDK 9.0では、特定のインスタンスでポートレートにハードコード化するのではなく、すべてのデバイスの向きをサポートするように表示コントローラーを変更しました。また、回転後にサイジングが正しく行われるようにしました。
ここで必要なのは、Mobile SDKアプリケーションを9.0バージョンに更新することだけです。
React Native向けSDK
React Native SDKでは、今回のリリースで、開発者の生産性を向上するための優れた更新がいくつか行われています。
OSおよびライブラリ更新
React Nativeは現在0.63.4です(いくつかのXCode 12の問題に対処します)
React Native向けのTypeScript
TypeScriptは、エンタープライズクラスのJavaScriptアプリケーションの構築および維持において開発者を支援するためにMicrosoftが作成したオープンソースプログラミング言語です。JavaScriptの上位セットで、主にオプションの静的型付け、クラス、インターフェースを提供します。TypeScriptは、エラーを早期にキャッチできること、コードの一貫性、デバッグ機能により、ここ数年フロントエンド開発者から人気を得ています。
詳細については、https://www.typescriptlang.org/を参照してください。
Mobile SDK 9.0では、React Native JavaScriptモジュールがTypeScriptで書き換えられました。
既存のReact Native向けMobile SDKアプリケーションがある場合、アプリケーションを変更する必要はありません。
新しいアプリケーションを作成している場合は、React NativeアプリケーションをJavaScriptで作成するかTypeScriptで作成するかを選択できます。TypeScriptで作成されたアプリケーションは、typed APIを活用してコードの静的検証を実行できます。新しいTypeScriptモジュールはこちらで確認できます。
新規テンプレート:ReactNativeTypeScriptTemplate
Mobile SDK 9.0では、TypeScriptを使用する、ReactNativeTypeScriptTemplateという名前の新しいReact Nativeテンプレートも追加されました。TypeScript開発者は、このテンプレートをベースにアプリケーションを生成して始めることをお勧めします。そのため、これをデフォルトのテンプレートにしました。
このテンプレートをベースに新規アプリケーションを構築するには、以下を実行します。
1 | forcereact create |
React Nativeテンプレートの最新化
Mobile SDKを最新化し、最新のテクノロジーを統合するための方法を常に探しています。React Native SDKへのTypeScriptの追加に加えて、React Nativeテンプレートの最新化も行いました。
Mobile SDK 9.0から、forcereactによって生成されるアプリケーションは依存関係を自動リンクします。依存関係を追加するとき、必要なのはpackage.jsonの追加だけです。ポッドファイルを変更する必要はなくなりました。依存関係用のネイティブライブラリは、プロジェクトに自動的にリンクされます。
全般的な更新
親/子の同期更新のための外部ID
Mobile SDK 8.0では、単一レコードおよびバッチ同期更新を拡張して、外部ID(挿入/更新(Upsert))による同期更新を可能にしました。
挿入/更新(Upsert)は重複の回避に役立ちます。同期更新が行われているときにネットワークが切断された場合、クライアントは、最後の要求が届いたのかどうかわからない可能性があります。挿入/更新(Upsert)を使用せずに同期を再実行すると、元の作成要求が実際にサーバーによって受信されていた場合、重複が作成されます。挿入/更新(Upsert)では、再生された要求は何も行いません(項目に対して同じ値を設定する更新を行います)。
開発者コミュニティから、親/子の同期更新中に重複レコードの問題に遭遇した開発者がいるというフィードバックが寄せられました。この問題を軽減し、開発者が独自のソリューションをコーディングする必要性をなくすために、Mobile SDKは、9.0で同じ外部ID機能を親/子の同期更新に対して追加しました。
外部IDの項目名が親情報または子情報で提供されていて、ローカルで作成される親または子レコードがその項目に対する値を持つ場合、Mobile Syncエンジンは、サーバーに対してcreateではなく、upsertを実行します。
この外部IDが挿入/更新(Upsert)を実行するためには、以下を実行する必要があります。
- 宣言的:組織内の関連オブジェクトにexternal ID型のカスタム項目を追加します。
- モバイルアプリケーション:外部IDの同期更新の管理を同期設定ファイルを通じて行うか、プログラムによって行うかを選択します。
宣言的に行う場合
Salesforce組織で、親または子情報用のオブジェクトでカスタム項目を作成します。項目には任意の名前を付けることができます。既存の項目であってもかまいません。ここで指定する項目名は、同期設定に配置する、またはプログラムによって使用するものと合致する必要があります。
モバイルクライアントの親および子情報で、「externalIdFieldName: “実際のカスタム項目名”」を指定する必要があります。
以下の同期設定の例で、項目名は次のとおりです。
- 親についてはExternalIdX。
- 子についてはExternalIdY。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
{
“syncName”:”parentChildrenSyncUp”, “syncType”:”syncUp”, “soupName”:”accounts”, “target”:{ “iOSImpl”:”SFParentChildrenSyncUpTarget”, “androidImpl”:”com.salesforce.androidsdk.mobilesync.target.ParentChildrenSyncUpTarget”, “parent”:{ “idFieldName”:”IdX”, “externalIdFieldName”:”ExternalIdX”, “sobjectType”:”Account”, “modificationDateFieldName”:”LastModifiedDateX”, “soupName”:”accounts” }, “createFieldlist”:[ “IdX”, “Name”, “Description” ], “updateFieldlist”:[ “Name”, “Description” ], “children”:{ “parentIdFieldName”:”AccountId”, “idFieldName”:”IdY”, “externalIdFieldName”:”ExternalIdY”, “sobjectType”:”Contact”, “modificationDateFieldName”:”LastModifiedDateY”, “soupName”:”contacts”, “sobjectTypePlural”:”Contacts” }, “childrenCreateFieldlist”:[ “LastName”, “AccountId” ], “childrenUpdateFieldlist”:[ “FirstName”, “AccountId” ], “relationshipType”:”MASTER_DETAIL” }, “options”:{ “fieldlist”:[
], “mergeMode”:”LEAVE_IF_CHANGED” } } |
プログラムによって行う場合
iOSで、null以外のexternalIdFieldNameを新しいファクトリメソッドに渡す親情報および/または子情報を作成します。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// From SFParentInfo.h
+ (SFParentInfo *)newWithSObjectType:(NSString *)sobjectType soupName:(NSString *)soupName idFieldName:(NSString *)idFieldName modificationDateFieldName:(NSString *)modificationDateFieldName externalIdFieldName:(NSString * __nullable) externalIdFieldName;
// From SFChildrenInfo.h + (SFChildrenInfo *)newWithSObjectType:(NSString *)sobjectType sobjectTypePlural:(NSString *)sobjectTypePlural soupName:(NSString *)soupName parentIdFieldName:(NSString *)parentIdFieldName idFieldName:(NSString *)idFieldName modificationDateFieldName:(NSString *)modificationDateFieldName externalIdFieldName:(NSString * __nullable)externalIdFieldName; |
Androidで、null以外のexternalIdFieldNameを新しいコンストラクタに渡す親情報および/または子情報を作成します。
1
2 |
<code>// From ParentInfo.java</code> <code>public</code><code> </code><code>ParentInfo</code><code>(</code><code>String</code><code> sobjectType</code><code>,</code><code> </code><code>String</code><code> soupName</code><code>,</code><code> </code><code>String</code><code> idFieldName</code><code>,</code><code> </code><code>String</code><code> modificationDateFieldName</code><code>,</code><code> </code><code>String</code><code> externalIdFieldName</code><code>)</code><code> </code> <code>// From ChildrenInfo.java</code><code>
public ChildrenInfo(String sobjectType, String sobjectTypePlural, String soupName, String parentIdFieldName, String idFieldName, String modificationDateFieldName, String externalIdFieldName)</code> |
OSおよびライブラリ更新
すべての素晴らしい新機能に加えて、OSおよびライブラリ更新がMobile SDKの新しいメジャーリリースで予定されています。
- iOS向けSDK
- iOSベースSDKは現在(13ではなく)14です。最小バージョンは12ではなく13です
- Android向けSDK
- AndroidターゲットAPIは(29ではなく)30です。
- ハイブリッド向けSDK
- Cordova iOSは(5.1.1ではなく)6.1.1で、WKWebViewを使用し、cocoapodの依存関係をネイティブで使用できます(以前はサードパーティプラグインを使用する必要がありました)。Cordova Androidは(8.1.0ではなく)9.0.0で、Cordova CLIは(8.1.2ではなく)10.0.0です。
- React Native向けSDK
- React Nativeは現在0.63.4です(いくつかのXCode 12の問題に対処します)
- 全般
- sqlcipherは(4.4.0ではなく)4.4.2です
- cocoapodの最小バージョンは、(1.7.5ではなく)1.8です
まとめ
Mobile SDK 9.0は、誰にとってもメリットがあります。マルチタスク処理のパワーを既存のiPadアプリケーションに追加できます。外部IDを活用して、親/子の同期更新の同期が再開する場合でも、ユーザには重複レコードが表示されないようにすることができます。React Native向けのTypeScriptにより、強力なデバッグを活用し、エラーを早期にキャッチできます。モバイルアプリケーションをMobile SDK 9.0にアップグレードして、今すぐ自身とエンドユーザのためにこれらの新機能を入手してください。
iOS向けのMobile SDKおよびAndroid向けのMobile SDKを参照してください。
その他のリソース
Salesforceは、Lightning Webコンポーネントがあらゆる場所(特にモバイル上)で動作することを確認するためのモバイルツールを提供しています。Salesforce Developers YouTubeチャネルでSalesforce Mobile Toolsプレイリストを確認してください。
著者紹介
Sue Berryは、Salesforceの製品管理担当でディレクターで、Salesforce Mobileに重点的に取り組んでいます。現在、Salesforce Mobile SDKおよびLWCデバッグ用の新しいモバイルツールを担当しています。15年以上にわたって開発者ツールを構築しています。
Brianna Birmanは、Salesforce Mobile SDKのリードエンジニアで、7年前からSalesforce Mobile製品に取り組んできました。
Wolfgang Mathurinは、Salesforce Mobileプラットフォームチームのアーキテクトで、10年前からSalesforce Mobile製品に取り組んできました。20年以上にわたって開発に携わっています。