大多数浏览器和
Developer App 均支持流媒体播放。
-
在多窗口情境下设定内容
了解如何为您 app 中的特定窗口设定内容。学习如何确定系统应当从通知、快捷指令项目和其他用户活动中打开哪个场景。
资源
相关视频
WWDC23
WWDC21
-
下载
大家好 我叫 Alex Schaefer
为了了解我们今天要讨论的问题 让我们先快速了解一下 iOS 12
在 iOS 12 中 我们 在你的 App 和用户界面之间 建立了一对一的映射 比如说一个通知来了
用户会点击它 那么这会把你带到相应的 App 中去 并且相应地 你的 App 将会更新你的用户界面 这很好 那有什么不同之处呢?
是这样 在 iOS 13 中 你可以同时运行多个用户界面 这会引发这样的问题——
响应此通知应激活哪个场景 其实 我知道你们都在说什么
问我的 App 就好了 这是我猜的 但是如果你的 App 没在运行怎么办 谁在乎呢 那就启动我的 App 就好了
好好 别着急 iOS 需要知道你的 App 中 哪个场景应该位于最前面
并且针对启动时间 响应激活 App 就好比刚刚那个进来的通知一样 因此 如果我们在后台 启动你的 App 并想要 合适的场景 我们必须 等到你的 App 完全加载 然后再等待 00:01:19.396 --> 00:01:20.966 A:middle 直到你可以做出决定
这可能会导致 不太理想的用户体验 系统基本上会 停下来等待反馈 当我点击通知时 我 希望它能立即到达某个地方 那么 我们能对此做些什么呢
好吧 让我们退后一步 让我们想一下 我们 有什么要和系统合作的地方 我们有你的 App 或许它正在运行 或许它不在 你的 App 包含了你的场景 以及每个场景的 功能的信息 这将派上用场
最后 系统会收到 这个传入通知 我们已经讨论了为什么我们不能 依赖于激活你的 App 并且 我们知道通知 必须以某种方式触发 适当的场景才能被激活 因此 考虑到这些限制 让我们尝试将解决方案 整合在一起
首先 我们需要找到一种方法 来描述通知所涉及的内容 所以 让我们添加一些 通知来使得 系统知道它是什么
然后我们需要让你的场景 以某种方式来描述 它们的能力 就像 什么样的内容 它们可以展示
那么 如果你的场景 正在描述它们 可以与系统合作的内容 并且通知中有 关于它内容的提示 那么我们就不需要你的 App 了
系统足够灵通到 能够根据该通知选择 要激活的所需场景
因此 为了考虑到上面这些场景 和这些场景的功能 我们需要思考这些场景是什么 它们的功能又是什么 其实这些功能 都包含在这个 UIKit 级别里 00:02:56.996 --> 00:02:58.616 A:middle 即 UISceneActivationConditions
这是 UIScene 中附带的一个对象 而你的场景激活 条件实际上只是 一些 NS 谓词 它们为特定可以激活的 场景设置了一个路径
让我们来深入了解一下 API
那么 你的激活条件 由两部分组成 即你的 预设谓词和你的 首选谓词 你应该将预先设定好的 谓词视为两者的主要谓词 这向系统表达了 哪些内容类型 场景可以展示
你的首选谓词是一种 向系统表达 此场景尤其 对特定类型的内容感兴趣 的方式 你应该将预设视为 表达能力 而首选 是一种描绘在 满足条件的场景中 应选择的内容的方法 我已经告诉过你们 这些谓词 可以帮助你们定义你们 能力 但是我还没有 真正详细谈及 这些谓词的作用
这些谓词对 称为目标内容标识符的内容 进行操作 你可能会问自己 那是什么 目标内容标识符 是字符串 它只是字符串 但是 它又比那 要复杂一点 目标内容标识符是 表示你们模型中数据的一种 结构化方式 系统不会访问 你的模型——那是你的事儿 但我们将要用它 作为一种建立起这些 场景激活条件的方法 iOS 13 将使用该 目标内容标识符 并根据你的 App 所有场景的 场景激活条件 对其进行评估
在内容应该定位到什么样的场景上 进行调用
Clown Town 是我们的令人兴奋的演示 App 它回答了 一个老掉牙的问题—— 随时订购一个小丑 到我现在的位置是什么样 那么 让我们来看看 Clown Town 的目标内容标识符 是什么样的 好吧 这看起来就像一个网址 在这种情况下 Clown Town 实际上使用的是通用链接 就像我们说的那样 目标内容标识符 理想情况下应该以结构化格式表达 就像通用 链接或者网址一样 你们中的许多人已经在使用 通用链接 并且它 在这里作为目标 内容标识符会很棒 我们来看看 SDK 目标内容标识符的 添加位置 首先是 UNNotificationContent iOS 13 中的新增功能 你可以 在使用新密钥 也即目标内容 ID 将其发送到 Apple 推送通知服务器之前 实际增强你的 JSON 有效负载
所以 这也引出了一个非常 重要的点 实际上你可以 同样在后端服务器上 构建此目标内容标识符 并实际上确定 通知应打开的场景
接下来 UIApplicationShortcutItem 已扩展为允许 使用目标内容标识符 今年 iPadOS 的新功能 你 其实可以长按 主屏幕上的图标并获得 相同的快速操作 就跟已经可以在 iPhone 上实现的一样
最后 NSUserActivity 使用此日期恢复 以及切换等功能 也非常有用
所以 让我们在 Clown Town 中 设置那个场景以响应 我们刚刚的目标 内容标识符
在顶部 我们有目标 内容标识符 这是我们的网址格式 它看上去 像是一个装备为名是 Crusty 的小丑 好了
在你的左侧 我们有一个大概 描述 我们可以在该地区订购的 所有小丑 这是我们的主要场景 我们的 App 中的所有内容 都包含在这里 用户实在不太可能 将 Crusty 与这个场景联系起来 我认为如此设置 这个场景的激活 条件是理想的 它可以显示任何东西 但 不特别首选任何东西 这是有道理的 这是我的主要场景 在这里我进入我的 App 它 有我的所有内容
幸运的是 那实际上 是创建新场景时的 默认设置 你的 UI 场景激活 条件将被设置为 允许任何内容 但并不特别首选任何内容
好的 在你的右边 我们为 Crusty 设置了一个场景 这个场景可以显示任何 特定的小丑的细节 但是 用户可能会 特别将 Crusty 与这个场景联系起来 所以 我们应该表达 这种关联 在我们的场景 激活条件下 因为 场景可以激活 且我们 更倾向于它 专门为 Crusty 激活 因此 让我们根据这些 要求 并且 为我们的细节化的场景 组合一些场景激活条件
好了 现在让我们把这些打破
对于这个场景 我们只想 激活与 Crusty 有关的场景 所以我们只是要检查 传入的目标内容 标识符是否 等于我们对 Crusty 的期望值 很好 现在 你会注意到 这种情况下 我们实际上对我们的预设 和我们的首选使用了 相同的谓词 这是一种非常常见的模式 你就会发现你在用这种模式 当你想要针对特定内容 定位场景时 当然 在这里我们可以接受任何其他小丑 这只是一个细节化场景 但如果我收到通知 我希望它能够 准确定位到 Crusty 的所在地
很好 那么 让我们讨论一下 在设置这些谓词时会发生什么
当我在场景激活条件下 设置 Crusty 谓词时 系统将打包这些谓词 并将它们发送到操作系统中的其他位置
这对 NS 谓词 在场景激活条件下 如何使用产生了一些影响 我现在想对它们进行讨论 场景激活条件对 使用 NS 谓词 有三个限制 首先 不允许基于块的谓词 遗憾的是 我们无法 在正在运行的 App 中 打包代码并将其发送到 系统的其他部分
第二 不允许使用基于 正则表达式的谓词 我们不能使用它们 是因为它们可能会 在评估场景谓词时 引入不确定数量的时间 我们鼓励你查看 类似的运算符 它事实上是 NS 谓词的 glob 运算符 它应该 帮助你做你可能想做的 所有种类的通配符匹配 话说到这 如果你 对如何使用正则表达式谓词 有独特的想法 欢迎使用反馈助手 并告知我们你的想法 我们非常想听到这些想法
最后 NS 谓词可以引用的 唯一关键路径是“SELF” 也就是说 你不会 根据字符串长度 或目标内容标识符的内容 设置场景激活所要求的谓词 我们希望你将会 使用的真实内容 放在你的模型中 接下来 让我们看一下 另一个示例 了解我们常用的 App 架构的 场景激活条件 让我们来谈谈一个选项卡式 App 它有点像 Safari 浏览器 你会看到 Safari 浏览器在这里 打开了两个标签 每个标签类似于 它们自己的文档 我们应该考虑 每个标签 因为它们是 自己的文档 同时它们有 自己的目标内容标识符 但请注意 如果我们将 其中两个目标内容标识符 显示在屏幕上 并且我们希望将其设置为 我们首选的场景激活条件 那么我们将如何做到这一点 首先 让我们检查一下预制的谓词
这非常简单 基于文档的 App 通常可以 在 App 中打开任何 类型的文档 因此 为了对其进行编码 我们实际上 在此使用始终为“true”的谓词 来描述任何场景 都可以显示传递给它的任何内容 它更会首选什么样的内容 因为这个 UI 有多个 选项卡 所以这就很合理 我们 使用类似复合谓词的东西 来收集其中的 所有子预测值 然后我们将在 场景激活条件下使用它
很好 好了 想要了解更多信息 请访问 developer.apple.com 有我们所有的幻灯片和 笔记信息 你可以去那里 获取更多有关信息 另外 真诚地感谢你们的到来 这是一次伟大的 WWDC 我们已经迫不及待想看到 你们会用这些新 API 做出什么 非常感谢你们
[掌声]
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。