WWDC Quick Look 💓 By SwiftGGTeam
Support multiple users in tvOS apps

Support multiple users in tvOS apps

元の動画を見る

ハイライト

「現在のユーザーとして実行」権限による tvOS 16、およびkSecUseUserIndependentKeychainこれにより、Apple TV のアプリは iPhone と同じようにユーザーごとにデータを分離できるようになり、家族全員がログイン認証情報を一度共有し、ユーザーを切り替えるときにそれぞれのプロファイルを自動的にロードできるようになります。

主要内容

Apple TV のマルチユーザー難題

Apple TV は、家族全員がビデオを見たりゲームをしたりするために使用するリビングルームの共有デバイスです。しかし、好みは人それぞれです。父はドキュメンタリーを見るのが好きで、母は韓国ドラマを追いかけ、子供たちは漫画しか見ません。ストリーミング メディア アプリは通常、各人が独自の視聴履歴と推奨事項を持つプロフィールを使用してこの問題を解決します。

iPhone ではこれは簡単です。アプリがプロファイルの選択を保存します。UserDefaults, 次回から自動読み込みをオンにしてください。ただし、Apple TV は共有デバイスです。特別な処理を行わない場合、家族のメンバーを切り替える場合、アプリはその人が変わったことを認識せず、前の人のプロフィールを表示したままになります。

tvOS 14 では、「現在のユーザーとして実行」権限が導入され、アプリを現在のシステム ユーザーとして実行し、データを自動的に分離できるようになります。しかし、ここには矛盾があります。メディア アプリは、家族全員が 1 つのアカウントを共有する (支払うのは 1 つの料金のみ) ことを望んでいますが、全員が独自のプロフィールを持っています。各ユーザーが個別のキーチェーンを持っている場合、全員が再度ログインする必要があります。

tvOS 16 のソリューションは次のとおりです。ユーザーの独立したデータ (プロファイルの選択、視聴記録) は別の場所に保存されます。UserDefaults、共有ログイン資格情報はユーザーに依存しないキーチェーンに保存されます。

2 種類のデータ、2 つのストレージ戦略

ユーザー関連データ: プロファイルの選択、ゲームの進行状況、個人設定。 「現在のユーザーとして実行」が有効になっている場合、このデータはユーザーごとに自動的に分離されます。 iOS 上のコードを変更する必要はなく、tvOS 上で直接動作します。

ユーザーに依存しないデータ: ログイン認証情報、ホームシェアリングのサブスクリプション情報。新しいものを使用するkSecUseUserIndependentKeychainロゴは保存され、すべてのユーザーがアクセスできます。

ユーザー切り替えの完了プロセス

  1. Siri リモコンの TV ボタンを長押ししてコントロールセンターを開きます
  2. 別のファミリーメンバーを選択します(tvOS 16 では、Apple TV にまだ追加されていない場合でも、iCloud ファミリーメンバーが自動的に表示されます)
  3. システムは切り替えプロンプトを表示し、現在のアプリにステータスを保存する時間を与えます。
  4. アプリが再起動され、新しいユーザーとして実行されます
  5. ユーザーに依存しないキーチェーンから共有ログイン資格情報を読み取り、ログイン インターフェイスをスキップします。
  6. 新規ユーザー向けUserDefaultsプロファイルの選択を読み取り、対応するコンテンツを自動的にロードします

新規ユーザーは、初めて使用するときにプロファイルを選択する必要があります。以降、切り替えるたびに、追加の操作なしでコンテンツを直接入力することになります。

ユーザー マッピングを手動でメンテナンスする必要はもうありません

tvOS 16は廃止されましたTVUserManagerシステム ユーザーをアプリ プロファイルに手動でマッピングする方法。システムはこのマッピングを自動的に処理するようになり、開発者は iOS スタイルのコードを記述するだけで済みます。

詳細

現在のユーザーとして実行を有効にする

08:22

Xcode の場合:

1.tvOSターゲットを選択します 2.「署名と機能」タブを開きます 3. [+ 機能] をクリックします。 4.「ユーザー管理」を検索して追加します 5.「現在のユーザーとして実行」にチェックを入れます

コードを記述する必要はありません。資格を追加すると、現在選択されているシステム ユーザーとしてアプリのプロセスが自動的に開始されます。UserDefaultsKeychain(デフォルト)、iCloudコンテナなどはユーザーごとに分離されます。

共有ログイン認証情報を保存する

05:25

func save(username: String, password: String) {
    guard let passwordData = password.data(using: .utf8) else {
        return
    }

    let attributes: [CFString: AnyObject] = [
        kSecAttrService: "MyApp" as AnyObject,
        kSecClass: kSecClassGenericPassword,
        kSecAttrAccount: username,
        kSecValueData: passwordData,
        kSecUseUserIndependentKeychain: kCFBooleanTrue
    ]

    let status = SecItemAdd(attributes as CFDictionary, nil)
    if status == errSecSuccess {
        self.credentials = (username, password)
    }
}

キーポイント:

  • kSecUseUserIndependentKeychainに設定kCFBooleanTrue寄託されたユーザーがキーチェーンと何の関係もないことを示します
  • すべてのユーザーはこのキーチェーン アイテムの読み取りと書き込みができます
  • その他のプロパティ (kSecAttrServicekSecAttrAccountなど)は変更されません
  • クエリ時にも追加しますkSecUseUserIndependentKeychain: kCFBooleanTrue見つける

共有認証情報を読み取る

func loadCredentials() -> (username: String, password: String)? {
    let query: [CFString: AnyObject] = [
        kSecAttrService: "MyApp" as AnyObject,
        kSecClass: kSecClassGenericPassword,
        kSecReturnAttributes: kCFBooleanTrue,
        kSecReturnData: kCFBooleanTrue,
        kSecMatchLimit: kSecMatchLimitOne,
        kSecUseUserIndependentKeychain: kCFBooleanTrue
    ]

    var result: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &result)

    guard status == errSecSuccess,
          let item = result as? [String: AnyObject],
          let username = item[kSecAttrAccount as String] as? String,
          let passwordData = item[kSecValueData as String] as? Data,
          let password = String(data: passwordData, encoding: .utf8) else {
        return nil
    }

    return (username, password)
}

ユーザー プロファイルの選択内容を保存および読み取ります

class ProfileData {
    private let selectedProfileKey = "SelectedProfile"

    func saveSelectedProfile(_ profileId: String) {
        // 自动保存到当前用户的 UserDefaults
        UserDefaults.standard.set(profileId, forKey: selectedProfileKey)
    }

    func loadSelectedProfile() -> String? {
        return UserDefaults.standard.string(forKey: selectedProfileKey)
    }
}

キーポイント:

  • コードは iOS のものとまったく同じです
  • 「現在のユーザーとして実行」を有効にすると、システムは自動的にUserDefaults現在のユーザーに分離 -家族それぞれが自分のものを持っていますUserDefaultsサンドボックス
  • TVUserManagerの手動マッピング方法は非推奨になり、必要なくなりました。

アプリケーションタイプ決定表

アプリケーションの種類推奨されるソリューション
メディア/ストリーミングメディア (プロフィール付き)現在のユーザー + ユーザーに依存しないキーチェーンとして実行
ゲーム (個人的な進歩)現在のユーザーとしてのみ実行
一般的なコンテンツ (レシピ、天気など)変更は必要ありません

重要ポイント

1.ストリーミング アプリ向けにシームレスなマルチユーザー切り替えエクスペリエンスを構築

  • 対処法: Apple TV のビデオ アプリに各家族のプロフィールを記憶させ、ユーザーを切り替えるときに自動的にロードします。
  • 実行する価値がある理由: tvOS 16 では、資格とキーチェーン ロゴを追加するだけで、iPhone レベルのパーソナライズされたエクスペリエンスを実現できます。
  • 開始方法: Xcode にユーザー管理機能を追加し、「現在のユーザーとして実行」を有効にします。ログイン時に使用しますkSecUseUserIndependentKeychain認証情報を保存します。プロフィールを選択して保存UserDefaults

2.ホームフィットネスアプリ用のパーソナルトレーニングプロファイルをデザインする

  • 内容: フィットネス アプリは、Apple TV 上の複数の家族メンバーをサポートし、それぞれが独自のトレーニング計画と進捗状況をサポートします。
  • 実行する価値がある理由: フィットネス データは当然、ユーザーごとに分離する必要があります。 「現在のユーザーとして実行」では、ゲーミフィケーションの進行状況、実績、ランキングを個別に計算できます。
  • 開始方法: 資格を有効にすると、トレーニングの記録と実績が保存されますUserDefaultsまたは CloudKit (ユーザーによって自動的に分離);家族のサブスクリプション情報はユーザーのキーチェーンとは独立して保存されます。

3.教育アプリ用に親が制御する複数の子モードを構築します

  • 内容: 子供向け教育アプリは、Apple TV 上で複数の子供をサポートし、個別の学習進捗状況とコンテンツ フィルタリング設定をサポートします
  • やる価値がある理由: お子様の年齢はそれぞれ異なり、適した内容や難易度も異なります。システムレベルのユーザー分離により、親がアプリ内で子供のアカウントを手動で切り替える必要がなくなります。
  • 開始方法: を使用しますUserDefaults各子供の年齢、学習の進度、コンテンツの好みを保存します。ペアレンタルコントロールのパスワードは、子供がバイパスするのを防ぐために、ユーザーのキーチェーンとは独立して保存されます。

4.ゲームアプリの家族共有アーカイブを実装します

  • やるべきこと: Apple TV でシングルプレイヤー ゲームを行うため、家族の各メンバーが独自に保存して進行状況を確認できるようになります。
  • 実行する価値がある理由: 「現在のユーザーとして実行」を有効にするだけで、追加のコードは必要ありません。 Game Center、iCloud アーカイブ、ローカル アーカイブは自動的に分離されます
  • 開始方法: ユーザー管理機能を追加し、「現在のユーザーとして実行」にチェックを入れます。ゲームにファミリー共有サブスクリプションがある場合は、ユーザーに依存しないキーチェーンを使用してサブスクリプションのステータスを保存します

関連セッション

コメント

GitHub Issues · utterances