WWDC Quick Look 💓 By SwiftGGTeam
Support multiple users in your tvOS app

Support multiple users in your tvOS app

元の動画を見る

ハイライト

tvOS 14 のユーザー管理機能には、現在のユーザーとして実行が追加されています。アプリケーションがサポートを宣言すると、現在の Apple TV ユーザーの iCloud、Game Center、およびローカル ストレージで実行され、ユーザーが切り替わるとシステムによって終了して再起動されます。


主要内容

Apple TVをリビングルームに置けば、自然に家族全員で共有することになります。 tvOS 13 では、コントロール センターにユーザーの切り替え機能が追加され、以下の機能も提供されます。TVUserManager、独自に構築されたアカウント システムを備えたアプリで、アプリ内プロファイルをデバイス ユーザーに関連付けることができます。しかし、多くのアプリには独自のプロファイルがありません。彼らは、iCloud、Game Center、ローカル データ、環境設定を家族ごとに分けておきたいだけなのです。

以前は、このようなアプリはすべてのデバイスにわたる一連の共有リソースに直面していました。ゲームの進行状況、実績、フレンドリスト、ローカル設定はすべて同じアプリケーション環境に含まれます。ユーザーが Apple TV アカウントを切り替えた場合、アプリには前のユーザーのボード、履歴、またはハイスコアが引き続き表示される場合があります。

tvOS 14 で提供されるソリューションは、現在のユーザーとして実行です。開発者が Xcode 12 の署名と機能にユーザー管理機能を追加すると、システムは現在選択されている Apple TV ユーザーにアプリをバインドします。このユーザーは、iCloud、Game Center、ローカル データ、および設定を取得します。

この機能の鍵はライフサイクルにあります。ユーザーがコントロール センターでアカウントを切り替えると、システムは実行中のアプリに短い保存ウィンドウを与え、その後プロセスを終了します。アプリがフォアグラウンドにある場合、システムは新しいユーザーのためにアプリを再起動します。元の読み取りおよび書き込み API は引き続き使用でき、データ分離はシステムによって行われます。

セッションのデモは、NSPersistentCloudKitContainerデータを同期するためのミニゲーム。この能力にアクセスする前、フェリペは自分のユーザーに切り替えた後もケイレブのボードを見ていました。この能力が接続されると、スイッチがキルとリスタートをトリガーし、フェリペは空のボードと 39 秒のハイスコアを確認し、ケイレブの 1:09 の記録は混同されません。


詳細

現在のユーザーとして実行を開く

(03:12) Xcode 12 からアクセスが開始されます。アプリ ターゲットの署名と機能を入力し、ユーザー管理機能を追加します。新しい「現在のユーザーとして実行」オプションがデフォルトで選択されます。

このステートメントは、アプリが現在の Apple TV ユーザーとして実行したいことをシステムに伝えます。宣言が有効になった後、アプリが iCloud、Game Center、ローカル ストレージ、環境設定にアクセスすると、システムはこれらのリソースを現在のユーザーにマップします。セッションでは、既存のストレージ API を引き続き使用でき、開発者がデータ分離のために読み取りおよび書き込みロジックを書き直す必要がないことが明確に述べられています。

キーポイント:

  • User Managementこれは、Xcode の Signing & Capabilities にある機能の入り口です。
  • Runs as Current Userこれは tvOS 14 の新しいオプションであり、Xcode 12 で機能を追加するときにデフォルトで選択されます。
  • 現在のユーザーが切り替わると、アプリは新しいユーザーのアカウントとストレージ コンテキストを取得します。
  • iCloud、Game Center、ローカル データ、および環境設定はすべて、この一連の分離スコープに分類されます。

ユーザー切り替え前にデータを保存する

(03:46) ユーザーが切り替わると、実行中のアプリが終了します。アプリが必要ですapplicationWillTerminateボード、進行状況、またはローカルの変更が失われないように、最小限の保存作業を行ってください。

func applicationWillTerminate(_ application: UIApplication) {
    guard game.hasUnsavedChanges else { return }

    let semaphore = DispatchSemaphore(value: 0)
    game.save { _ in semaphore.signal() }
    semaphore.wait()
}

キーポイント:

  • applicationWillTerminateこれは、アプリがシステムによって保存される最後のチャンスです。
  • guard game.hasUnsavedChanges else { return }変更がない場合はすぐに戻り、ユーザーが切り替えて続行できるようにします。
  • game.save保存されていないデータをローカルおよび CloudKit に書き込むことは、デモのゲーム同期データ シナリオと一致しています。
  • DispatchSemaphore非同期保存が完了するまでに時間がかかりますが、セッションでは、時間が限られており、作業負荷をできるだけ小さくする必要があることも通知されます。

他のユーザーへの CloudKit 通知を破棄する

(04:46) 複数のユーザーをサポートした後、同じ Apple TV でアプリを使用した他のユーザーも CloudKit サブスクリプション通知を生成する可能性があります。アプリが通知を受信すると、通知が属するユーザーが現在の CloudKit ユーザーと等しいかどうかを確認する必要があります。

func application(
    _ application: UIApplication,
    didReceiveRemoteNotification userInfo: [AnyHashable : Any],
    fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
) {
    if let notification = CKNotification(fromRemoteNotificationDictionary: userInfo),
       notification.subscriptionOwnerUserRecordID == game.currentUserRecordID {
        game.handle(notification, completionHandler: completionHandler)
    }
    else {
        completionHandler(.noData)
    }
}

キーポイント:

  • CKNotification(fromRemoteNotificationDictionary:)プッシュ ペイロードから CloudKit 通知を復元します。
  • subscriptionOwnerUserRecordIDこれはセッションによって言及される新しいチェックポイントであり、サブスクリプションが属するユーザーを識別するために使用されます。
  • game.currentUserRecordID現在実行中のコンテキスト内の CloudKit ユーザーを表します。
  • 通知は、他の人の同期イベントが現在のユーザー インターフェイスに適用されるのを避けるために、2 つのレコード ID が等しい場合にのみ処理されます。
  • 現在のユーザーに属さない通知は直接呼び出されますcompletionHandler(.noData)処理するデータがないことをシステムに知らせます。

デモでデータ分離を検証する

(05:59) デモ プロジェクトでは、能力が接続されていない場合の問題が最初に示されています。Caleb のゲームの進行状況とハイスコアは依然として画面上に表示され、Felipe はユーザーを切り替えた後も自分のデータが表示されません。

(06:47) アクセスする手順は 3 つだけです。アプリのターゲットを開き、ユーザー管理機能を追加し、現在のユーザーとして実行が選択されていることを確認します。再実行後、ユーザーの切り替えにより古いプロセスが強制終了され、システムは Felipe のためにゲームを再起動します。

(07:30) 再開されたゲームはフェリペ自身のデータを読み取ります。彼には未完成のボードがないため、メイン メニューには「新しいゲームを開始する」と表示されます。彼の最速タイムは39秒です。 Caleb の 1:09 のタイムは Caleb のユーザー環境に残ります。

キーポイント:

  • このメカニズムは、独自に構築されたプロファイルを持たないアプリに適しています。
  • 使用NSPersistentCloudKitContainerアプリは引き続き iPhone、Apple TV、その他のデバイス間でデータを同期できます。
  • アプリは引き続き、終了前の保存と CloudKit 通知の所有権チェックを処理する必要があります。

重要ポイント

  • 家族向けゲームの独立した進行

  • 内容: 同じ Apple TV 上の各家族メンバーが独立したセーブ、ハイスコア、および Game Center データを保持できるようにします。

  • 実行する価値がある理由: セッションのデモンストレーションは、現在のユーザーとして実行が現在のユーザーに応じて iCloud、Game Center、およびローカル データを分離できることを証明します。

  • 開始方法: ユーザー管理機能を追加し、現在のユーザーとして実行が有効になっていることを確認してから、applicationWillTerminate未完成のボードを に保存します。

  • 複数のデバイス間で継続的にプレイできる tvOS バージョン

  • 内容: ユーザーは iPhone でゲームを開始し、リビングルームに戻り、Apple TV で同じゲームを続けます。

  • 実行する価値がある理由: トランスクリプトには、誰もが自分の iCloud データにアクセスし、Apple TV と他のデバイスの間で進行状況を同期できることが明確に記載されています。

  • 開始方法: 既存の iCloud を維持するか、NSPersistentCloudKitContainerデータ層は、tvOS アプリが現在のユーザーとして実行されるように構成します。

  • 家族向けの動画は引き続き視聴されます

  • 内容: 各ユーザーの再生位置、最近のビュー、同じビデオ アプリの設定を保存します。

  • 価値がある理由: tvOS 14 は、リビング ルームの共有デバイスに適した独立したローカル データと設定を現在のユーザーに提供します。

  • 開始方法: まずユーザー管理機能にアクセスし、次に既存の「継続視聴」データを現在のアプリ ストレージに書き込み、ユーザーが切り替わったときにシステムがアプリを再起動できるようにします。

  • CloudKit によって通知されるユーザー隔離

  • 内容: 現在の CloudKit ユーザーに属するサブスクリプション通知のみを処理します。

  • 価値がある理由: マルチユーザー Apple TV では、同じアプリが他のユーザーが残した CloudKit 通知を受信する可能性があります。

  • 開始方法: リモート通知を受信したら読んでくださいsubscriptionOwnerUserRecordIDは、現在のユーザー レコード ID と等しい場合にのみ、インターフェイスまたはデータを更新します。


関連セッション

コメント

GitHub Issues · utterances