概要
App Clipのユーザーが完全版Appをインストールすると、完全版AppがApp Clipに置き換わり、すべての呼び出しを代わりに受け取ることになります。そこで、App Clipを使い慣れたユーザーが完全版Appを使い始めた場合に、優れたユーザー体験を提供することが重要です。
以下はその例です。
-
ユーザーがApp Clipを使用した際に入力した情報をAppで表示する。
-
ダウンロードしたデータをAppが利用できるようにする。
-
ユーザーがアカウントに再度ログインしないですむようにする。
App Clipと完全版Appのデータ共有
App Clipはデータを共有コンテナに保存することで、完全版Appがそのデータにアクセスすることができます。完全版AppがApp Clipと置き換わった際、このデータにアクセスできるため、ポジティブなユーザー体験を提供できます。
共有コンテナにデータを保存するには
-
App Clipと完全版Appの両方のターゲットにApp Groups機能を追加します。
-
両方のターゲットで、App Groups機能に同じAppグループを追加します(例:
group
)。.example App .app Clip Migration -
App Clipのコード中で、共有コンテナのURLを
container
(英語)を使って取得し、そのURLを使って、URL(for Security Application Group Identifier:) write(to:
(英語)などでデータを保存します。atomically: encoding:) -
Appのコードの中で上記の関数を使って共有コンテナのURLを取得し、
init(contents
(英語)などを使ってコンテンツにアクセスします。Of:)
共有コンテナに加えて、App Clipは完全版Appもアクセスできる共有のUser
(英語)インスタンスに情報を保存することもできます。次のコードでは、構成済みのAppグループを使って共有のUser
インスタンスを作成し、文字列を保存しています。
guard let sharedUserDefaults = UserDefaults(suiteName: "group.exampleApp.appClipMigration") else {
// Error handling
}
sharedUserDefaults.set("A sample string", forKey: "sharedText")
ユーザーが完全版Appをインストールすると、Appから共有のユーザーデフォルトにアクセスできます。たとえば、上記のコードで保存した文字列にアクセスするには、以下のコードを使用できます。
guard let sharedUserDefaults = UserDefaults(suiteName: "group.exampleApp.appClipDataMigration") else {
// Error handling
}
guard let migratedData = sharedUserDefaults.string(forKey: "sharedText") else { return }
さまざまなAppやApp Clipのやり取りの中でユーザーのプライバシーを保護するため、App Clipがデータを共有できるのは、対応する完全版Appに限定されます。さらに、App Clipがキーチェーンに保存する情報については、対応する完全版Appもアクセスできません。
重要
パスワードなどの機密情報を、共有のAppコンテナやユーザーデフォルトなどに絶対に保存しないでください。
「Appleでサインイン」の提供
App Clipでは、任意のテクノロジーを使ってアカウントへのサインインや新規アカウントの作成機能をユーザーに提供できます。ただし、ユーザーがアカウントにログインすることが必要なApp Clipでは、「Appleでサインイン(英語)」を提供することを検討してください。シンプルで安全、しかもプライバシーを保護したアカウント作成とサインインに加えて、ユーザーが完全版Appに切り替えた際にもポジティブな体験を提供することができます。
「Appleでサインイン」の機能を提供し、共有データコンテナを作成する場合は、ユーザーが完全版Appを使い始めたときに再度ログインしなくてもすむよう、適切なユーザー体験を設計してください。次のコードでは、ASAuthorization
(英語)を共有のUser
(英語)インスタンスに保存します。
let groupUserDefaults = UserDefaults(suiteName: "group.com.example.appClipDataMigration")
guard let credential = authorization.credential as ASAuthorizationAppleIDCredential else { return }
groupUserDefaults?.set(credential.user, forKey: "SavedUserID")
このAppのコードで保存されているApple IDの認証資格情報を取得し、これをユーザーのサインインに使用します。
let provider = ASAuthorizationAppleIDProvider()
let groupUserDefaults = UserDefaults(suiteName: "group.com.example.appClipDataMigration")
let user = groupUserDefaults?.get("SavedUserID")
provider.getCredentialState(forUserID: user) { state, error in
if state == .authorized {
readFavoriteSmoothies(user)
}
}