大多数浏览器和
Developer App 均支持流媒体播放。
-
在 Apple tvOS App 中提供多用户支持
了解如何在您的 Apple tvOS App 中打造个性化的个人体验。我们将介绍如何提供单个复选框来存储个人资料数据、游戏保存状态等,使每位用户都享有相同的数据分离水平,就如同使用个人设备 (如 iPhone) 那样。我们还会探索新的用户专属钥匙串将如何帮助家庭里多位用户继续享有持续不变的登录体验。
资源
相关视频
WWDC22
WWDC21
WWDC20
-
下载
♪ ♪ Felipe:嗨 我是 Felipe 我是 tvOS 团队 的软件工程师 今天我很高兴与大家分享我们在 tvOS 16 中所做的改进 可以让您更轻松地 在 App 中支持多用户 Apple TV 是为所有人使用 而设计的 自 tvOS 13 以来 我们一直 在改进 Apple TV 上的多用户功能 在 tvOS 16 中 我们提供了一些新功能 可以 让在所有 App 中 支持多用户变得更容易 我将首先简单介绍 Apple TV 上的多用户功能 向您展示在每个人都使用的设备上 个性化 App 是多么容易 然后我将演示为流媒体 App 的 每个用户 存储用户资料选择有多么简单 最后是为您的 App 提供最适合方法的一些建议 在 tvOS 16 中 我们让整个 家庭都能更轻松地使用 Apple TV 当您按住 Siri Remote 上的电视按钮时 “控制中心”就会出现 顶部是此 Apple TV 上的 用户列表 tvOS 16 中 有一项新功能 让用户列表包含还没有被添加的 iCloud 家庭成员 让整个家庭都可以 比以往更轻松地使用 Apple TV
在这里 Anne 还 没有出现在 Apple TV 上 加号图标会给出建议的用户 要让 Anne 加入 我们只需选择建议用户
Anne 需要做的就是把 iPhone 带到 Apple TV 所在房间 并在 iPhone 上确认连接 仅此而已 Anne 现在可以访问 在 Apple TV 上的数据 现在让我们回到 Anne 的 iPhone 我们来看看 Anne 最喜欢的视频流媒体 App 这个 App 由整个家庭使用 每个成员都有自己的个人资料 当 App 首次启动时 它会显示个人资料选择器 Anne 选择了她的个人资料 这个 App 在个人设备上运行时 可以简单地将首选个人资料存储在 NSUserDefaults 中 甚至放入 CloudKit 以使其同步到所有设备
每个家庭成员的 iPhone 都会记住该成员的首选个人资料 当 App 打开时 无需一直询问要使用哪版个人资料 Apple TV 是全家人 共享的设备 我们认为 让每个使用 Apple TV 的人都能访问 自己的内容和数据非常重要 在 tvOS 14 中 我们引入了 App 以当前用户身份运行的能力 使用单个复选框添加 “以当前用户身份运行”资格 完全不需要代码更改 App 就可以访问每个用户的数据 就像在 iPhone 上一样
调用这些 API 的 iOS 代码 可在 Apple TV 上按原样运行 就像每个人都在使用 属于自己的 Apple TV 当 App 启动时 tvOS 会处理好一切 隐私和安全问题全部由系统处理 “以当前用户身份运行” 资格非常适合游戏 以及任何与个人进程有关的 App 但是 带有个人资料的 媒体 App 则需要更多 到目前为止 在我的例子中 跳过了一个重要部分:登录 我们认为登录需要 尽可能简单且不那么频繁 在 tvOS 15 中 我们 引入了一项允许人们使用 iPhone 或 iPad 无缝登录 tvOS App 的功能 这是一种绝佳的登录体验 各个设备协同工作 提供登录 Apple TV 最便捷的方式 Apple TV 上 不直接提供的功能 就像您在 iCloud Keychain 中的 密码一样 只需轻点一下即可 想要了解如何打造出色的登录体验 请观看 WWDC 2021 的 “简化 tvOS App 的登录”讲座
今年我们将引入 tvOS 上 对 OAuth 和密钥的支持 密钥是一种出色的 全新身份验证技术 用于替换您的 App 和 网站中的密码 如要了解有关密钥的更多信息 请观看“认识密钥”视频 但简单和方便并不是全部 让登录仅仅发生一次也很重要 为了使用“以当前用户身份运行” 实现这种最佳用户体验 我们在 tvOS 16 中 引入了一个简单的新 API 它是 Keychain Services 中的一个新常量 允许 App 访问独立于 用户的“钥匙串” Apple TV 上的所有用户始终 可以访问使用此新密钥存储的项目 让我们来看一个例子 这是一种在“钥匙串”中 保存项目的方法 带有用户名和密码 要将项目保存到 独立于用户的“钥匙串” 您所要做的就是向传递给函数 SecItemAdd 的属性字典 添加一个新键 我们只需将 true 作为 键 kSecUseUserIndependentKeychain 的值传递
独立于用户的“钥匙串”设置好后 您读取和写入的项目 将对所有用户可见 新的 Keychain API 和“以当前用户身份运行”资格的 结合 让您的 App 享有 iPhone 和 Apple TV 的精华 在共享设备上进行简单的 各用户数据分离 同时保持 Apple TV 上的单点登录体验 在 tvOS 16 中 我们已弃用手动将个人资料映射到 TVUserManager 中系统用户的方法 您不再需要维护 用户到个人资料的映射 系统会为您处理 您在 iOS 上使用的相同 API 也可以在 Apple TV 上原样使用 这变得容易了许多 让我通过演示来介绍实际使用情况 我将引导您完成一个示例 App 它代表含个人资料的媒体 App 这是我的视频流媒体 App 目前它没有使用我谈到的任何功能 它不以当前用户身份运行 也没有使用新的 Keychain API 我会继续登录并向您展示
登录后 我看到了一个 用户个人资料列表 当前用户是 Mei 所以我选择她的个人资料
选择个人资料会显示 Mei 可能想看的个性化内容
晚些时候 Anne 坐在沙发上看电视 通过长按 Siri Remote 上的 电视按钮打开“控制中心” 控制中心顶部是用户列表 绿色复选标记表示当前用户 我现在要切换到 Anne 并打开 App
正如预想的那样 App 再次显示个人资料选择器 所以 Anne 可以选择 自己的个人资料
但请注意切换回 Mei 时 会发生什么
App 仍然停留在 Anne 的 个人资料中 它不记得 Mei 以前选择过 她首选的个人资料 借助 tvOS 16 中的新功能 用户体验可以大幅改善 我希望使用该 App 的人 不必再次选择正在观看的人 让我们转到 Xcode 我会向您展示这有多么容易 让我的 App 以 当前用户身份执行非常简单 我要做的就是为我 App 的 目标添加一项性能 在我 App 的目标中 我将转到 Signing and Capabilities 选项卡 就在标签下 在左上角 我将点按“添加性能”按钮 它将打开性能列表 我感兴趣的是“用户管理”性能 所以我将输入“用户”来进行筛选
现在我只需连按 要添加到我的 App 的性能
在这里“以当前用户身份运行” 复选框 已经默认选中 这正是我所需要的 使用此资格 我的 App 的 进程将始终 以当前选择的用户启动 系统将确保每个 用户的数据是有区别的 所有数据包括“钥匙串” 但是对于我的 App 而言 为每个用户配备独立的“钥匙串” 会产生意想不到的副作用 这将要求每个用户单独登录 在 tvOS 16 中 我们可以在当前用户身份运行时 保持所有用户使用一个帐户的体验 使用新的 Keychain API 来访问独立于用户的“钥匙串”即可 我现在去 KeychainController 类 并用它来读写“钥匙串”
这里的属性 baseQuery 有访问 我 App 的认证信息时需要的键 要更新它以便使用 独立于用户的新“钥匙串” 我所要做的就是 在字典中添加一个新元素 我将添加新的 kSecUseUserIndependentKeychain 并将其设置为 true
我只需要更改这些内容 来以使 App 与所有用户 共享认证信息 没有其他的了 不过 需要注意的一个重点是 其他所有数据仍然 是基于各个用户区别的 就像我将要用来记住每个用户 个人资料选择的 UserDefaults
现在我要打开 ProfileData 类 此文件在我的 iOS 和 tvOS 项目之间共享 事实上 我 App 的 iOS 版本 已经在 UserDefaults 中 存储了用户资料选择 但仅限在 iOS 上运行时 那是因为 iPhone 是 个人设备 但现在我的 App 以当前用户身份运行 让 Apple TV 可以 像个人设备一样 我可以移除打勾的 iOS 选项 并让 代码在 Apple TV 上以相同的方式工作 系统将确保为每个用户 使用正确的 UserDefaults 当我运行新版本的 App 时 它以当前用户身份启动 也就是 Mei Mei 登录并选择她的个人资料 以当前用户身份运行 App 时 它运行的方式就像 Apple TV 在那一刻是一台个人设备 Mei 的设备 Mei 的个人资料选择 存储在她的 UserDefaults 中 当 Anne 观看的时候 可以使用“控制中心” 切换到自己的用户 系统会搭建一个用户切换 UI 它留出了时间 让您在重新启动之前完成最后的任务 tvOS 现在 以 Anne 的身份重新启动 App 现在 Apple TV 是 Anne 的设备 登录提示跳过了 因为认证信息已存储在 独立于用户的“钥匙串”中 所有用户都可以访问 但是 Anne 的 UserDefaults 中 还没有存储个人资料选择 所以个人资料选择器出现了 选中 Anne 的个人资料 将选择保存到 UserDefaults 中 好了 现在 Mei 和 Anne 都选择了个人资料 切换用户时 App 将不再显示任何插页式提示 它将始终直接转到内容 自动为每个人选择正确的个人资料 每次都是如此 这就是在 tvOS 16 中 我们如何让记住每个用户的 个人资料变得更加容易 使用一个简单的新 API 来 访问独立于用户的“钥匙串” 由系统分别处理每个用户的数据 现在您已经了解了如何 记住每个用户的个人资料选择 而无需每个人单独登录 让我们回顾一下 App 在 Apple TV 上的运作方式 没有以当前用户身份运行 资格的 App 使用“默认用户”的资源 您可以将其视作 Apple TV 自己的资源 切换用户对 App 的进程 没有影响 如果您想要进行个性化 以下是我的建议 这张表格显示了由您在 tvOS App 上 使用的功能决定的可用性能 如果您的 App 是媒体 App 或与之相似的 通过个人资料显示 个性化内容的 App 在使用 Apple TV 的 所有人之间共享一个帐户 您可以采用“以当前 用户身份运行”的资格 并使用独立于用户的 新 Keychain API 如果像游戏那样 在您的 App 中个人进程非常重要 您只需要采用 “以当前用户身份运行”的资格 tvOS 将处理其他事务 对于所有其他 App 也就是向所有用户 呈现相同内容的 App 例如食谱 App 您就不必进行任何操作 只需在 Xcode 中创建 一个新的 tvOS App 项目 想要了解有关 “以当前用户身份运行”的更多信息 请观看 我们在 WWDC 2020 的讲座 我们相信顺畅地直接前往内容 是 tvOS App 的最佳体验 我希望所有这些功能都可以帮助您 在 App 中实现出色的大屏幕体验 感谢观看 希望您享受本次大会
-
-
5:25 - Save item in user independent keychain
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 else { self.credentials = (username, password) } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。