大多数浏览器和
Developer App 均支持流媒体播放。
-
通用链接的新功能
利用通用链接,安装或未安装你 app 的用户,均可使用你的内容。获取关于通用链接 API 发展的最新消息,如 Apple Watch 与 SwiftUI 支持等。学习如何使用“百搭”、“次级分站变量”与 Unicode 支持等高级规律匹配功能,降低 app-site-association 文件的体积与复杂程度。此外,你还将学会如何对关联域名数据进行缓存,以此为 app 用户提供更加优秀的初始启动体验。
资源
相关视频
WWDC22
WWDC21
WWDC20
WWDC19
-
下载
(你好 WWDC 2020) 大家好 欢迎来到 WWDC
大家好 欢迎收看 “通用链接中的新功能” 我叫 Christopher Linn 我们以前在 WWDC 上讨论过通用链接 但我们想给你简单复习一下 (通用链接的定义) 通用链接是 HTTPS 或 HTTP URL 它们代表了在 Web 和 app 中的内容 它们允许用户在 app 中 而不是在 Web 浏览器中打开内容 从而让你提供更丰富的体验 你可以通过向 app 添加特殊权限 即关联域权限 并将 JSON 文件添加到 Web 服务器 来创建它们 该权限提到你的 Web 服务器的域名 Web 服务器会提到你的 app 的 app 标识符 这在 app 和网站之间创建了一个 安全的双向关联 允许你的 app 代表 你的网站执行特殊任务 在当前使用自定义 URL 方案的情况下 你应该尽快迁移到通用链接
不建议使用自定义 URL 方案 有关什么是通用链接以及 如何采用它们的更多详细信息 请访问我们 WWDC19 的会话 在对通用链接进行了精简回顾之后 让我们来看看有趣的内容 对新平台的支持 我们今年增加支持的 第一个也是最小的平台是 watchOS 通用链接在 watchOS 上的工作方式 与在我们其他平台上所做的那样 但是有一些特定于平台的差异 我们想和大家分享 首先 在使用 WatchKit 时 API 与使用 UIKit 或 AppKit 时不同 重要的是要记住你的权限 包括关联域权限 应用于你的 WatchKit 扩展 而不是包含 WatchKit app 在 iOS 上或使用 Mac Catalyst 时 你实现 UIApplicationDelegate 方法 “app :继续 UserActivity: 还原-处理程序” 以处理传入的通用链接 我们已经在前面的会话中展示了 如何使用这个委托方法 当要在另一个 app 中打开通用链接时 你可以使用 UIApplication openURL 但是 在 watchOS 上 你使用的是 WatchKit 而不是 UIKit 因此要在 watchOS 上采用 我们需要在这里做一些更改 (添加对 WATCHOS 的支持) WKExtensionDelegate 的 handleUserActivity 方法 负责处理传入的通用链接 此方法的主体将与 iOS 和 macOS 上的 基本相同 要在另一个 app 中打开 URL 可使用 WKExtension 的 openSystemURL 方法 就像在其他平台上一样 若你想要在未安装的 app 中 打开通用链接 该链接将无法打开 现在 Safari 在 watchOS 上不可用 只有在邮件和消息等有限的环境中才可用 并且此方法不返回值或接受完成处理程序 因此 与其让用户毫无反馈 倒不如在 watchOS 上向用户 呈现用户界面 如下所示 在这里你可以看到 我们一直在开发的一个 app 它向我们展示了我们最喜欢的餐厅菜单 它让我们选择自己喜爱的美食 然后通过调用一个通用链接 在每家餐厅的 app 中点餐 不过 这款 Apple Watch 并没有安装这家餐厅的 app 所以当我们点击订购按钮时 就会出现这个提示 告诉我们继续使用配对的 iPhone 那么 我们来快速总结一下 这些就是你在使用 WatchKit 时 用来处理和打开 通用链接的方法 这些是使用 UIKit 时的等效方法 请注意 当你的 app 配置为使用 UIScene 时 则需要实现与仅使用 UIApplication 时 不同的委托方法 AppKit 类似于 UIKit 但不同于 UIKit 最终 你所使用的 API 将取决于你所使用的平台和 SDK 不过 我们很高兴地告诉你 SwiftUI 今年也增加了对通用链接的支持 无论你使用哪种平台或 SDK 看起来就像这样 有关今年 SwiftUI 改进的更多信息 请访问《SwiftUI 的新增功能》 现在在 watchOS 上 和使用 SwiftUI 时都有通用链接 可真让人兴奋 我们也有新的特性可用于我们的所有平台 让我们来向你逐一介绍 (增强模式匹配) 首先 快速复习一下 模式匹配是如何与通用链接工作的 你可以在模式字符串中 使用星号和问号字符 来指定通配符 (通配符是如何工作的?) 星号可以匹配零个或多个字符 而且很是贪心 它可以匹配尽可能多的字符
问号正好匹配一个字符 若要匹配至少一个字符 请使用问号后跟星号 有关使用通配符 进行模式匹配的更多信息 请看一下去年的视频 现在来看看新的酷玩意儿 (不区分大小写的模式) 我们今天要宣布的第一个新特性 就是支持不区分大小写的模式匹配 我们已经收到了很多关于这个功能的请求 假设你有一个像这样的模式 它将匹配以路径组件“sourdough” 开头的任何路径 其后至少有一个字符 不过 它只能与小写单词“sourdough” 相匹配 因此 为了支持所有可能的 大小写字母混合 你可能希望为每个字符组合添加模式 但其实 你可能不想要这么做 有一种说法是酵母太多了 但你不用再担心碳水化合物昏迷了 因为我们在组件代码字典中 引入了一个新密钥 区分大小写 将其值设置为“错误” 以禁用区分大小写的模式匹配 并启用不区分大小写的模式匹配 如今 macOS Catalina 10.15.5 和 iOS 13.5 都提供了 不区分大小写的模式匹配 接下来 让我们谈谈 Unicode URL 总是 ASCII 当你遇到包含 非 ASCII Unicode 字符的 URL 时 实际上你遇到的是百分比编码字符 就像你在这里看到的 (UNICODE 模式) 字符串转换为 UTF-8 然后将 UTF-8 序列中每个字节的 十六进制表示形式 放入 URL 中 这是一道美味的四川菜 名为“蚂蚁上树” 不过即使是一个流利的中文读者 也很难从这个 URL 上分辨出这一点 如果这个图案能包含实际的汉字 那岂不是很好吗? 好消息是 现在可以做到了 将密钥百分比编码添加到组件代码字典中 并将其值设置为“错误” 即会禁用百分比编码 也就意味着你的模式被匹配为 32位 Unicode 码位序列 而不是 7 位 ASCII 字符 macOS Big Sur 和 iOS 14 支持 Unicode 当然 你可以在同一模式中 同时使用百分比编码 和不区分大小写 我们支持不区分大小写的 Unicode 模式匹配 (结合 UNICODE 和不区分大小写) 但这可能会有点重复 因为我们在这里两次指定了百分比编码 也指定了两次区分大小写 现在可以添加“默认值” 这是包含默认情况下应用于 所有模式的值的字典 除非某个模式显式地覆盖它 一旦我们添加了这个密钥 我们就可以从每个单独的组件中 删除百分比编码 和区分大小写的密钥 这样干净多了 如果它是一个同级组件 它将应用于该组件数组中的所有模式 如果它是“详细信息”的同级组件 那就将适用于此域的所有通用链接 并且默认值可用于 macOS Big Sur 和 iOS 14 以及 Unicode 支持 现在让我们来看一个 来自真实世界的模式匹配故事 (模式匹配在实践中的应用) 这是根据一个真实的故事改编的 我和我的同事 Jonathan 正在开发一个订餐 app 当我们谈论 watchOS 的支持时 你曾短暂地看到过这款 app 这里有一个我们想要模式匹配的 URL 它包含由两个字母的语言代码、下划线 和两个字母的国家代码 组成的区域设置代码 后面的是产品名称 来自我们网站上出售的 并且出现在我们相应 app 中的 其中一种食品 这样的简单模式可以合理地匹配 像这样的 URL 看起来就像你在这里看到的 请记住 问号与单个字符匹配 问号后跟星号 匹配一个或多个字符 但是这种模式将匹配比我们想要的 更多的 URL 那么在我们没有开展业务的国家 出现不支持的语言 不销售的产品时 该怎么办? 这个模式全都能匹配
我们在模式匹配方面的第一次尝试涉及到 对我们想要匹配的可能值列表进行硬编码 如果我们支持的 地区和语言很少 并且只有少数几种产品 那么这种方法可能会奏效 但多亏了 Jonathan 的努力 我们的业务遍及全球 100 多个国家 一旦我们增加了需要销售的产品 一切都变得混乱了 如果我们只考虑每两个字母的语言代码 每两个字母的地区代码和四个乘积 那就是在寻找180万种可能的模式 它们占用了超过27兆字节的空间 那是因为模式匹配具有指数复杂性 我们看了一下 apple-app-site-association 文件 然后说 再继续改善一下吧 我们很开心能引入通用链接的新功能 我们称之为“替代变量” 它们是什么?简单地说 它们是可以匹配的字符串的命名列表 这些变量出现在模式匹配字符串中 代表你指定的所有值 它们的名字几乎可以包含任何字符 稍后 你将了解到为什么美元符号 和括号会受到限制 在模式中遇到变量名时总是区分大小写 另一方面 你指定的值 可以包含用于通配符匹配的问号和星号 但不能引用替换变量 它们不会循环 如果模式匹配区分大小写 则值也会区分大小写 这是默认行为 如果你启用了不区分大小写的模式匹配 那么值将相应地匹配 为让你更好了解 我们内置了一些常见的替换变量 第一个是 alpha 它都是大写和小写的 ASCII 字母 (预定义替换变量) 你可以在这里看到 为什么美元符号和括号字符受到限制 当在模式中引用时 它们是变量名称的一部分
“Upper”和“Lower” 是 ASCII 字母的大写和小写 “Alnum”是“alphanumeric” 的缩写 并匹配所有 ASCII 字母和数字零到九 “digit”是十进制数字 “xdigit”是十六进制数字
这些变量相当于标准 C 库中命名类似的 字符类 接下来是“地区” 它是 Foundation 的区域设置类型识别的 每个 ISO 区域代码 最后是“语言” 它是每个 ISO 语言代码 让我们来看看 apple-app-site-association 文件 那是我们在几张幻灯片前担心过的内容 以下是在完整文件中出现的所有这些模式 自从有了替代变量 我们就准备好从这个组合的噩梦中醒来了
我们要做的第一件事是 在“applinks”下添加一个新的键值对 命名为“替换变量” 该键的值是代码字典 代码字典中的关键字是变量名 值是包含要匹配的子字符串集的数组 我们在这里添加的变量名为“食物” 有四个可能的值
现在我们要在这些模式中使用这个变量 看我让 27 兆字节消失无影踪了
哇 这是一个明显的改进 我们通过使用三个替换变量 完成了这一壮举 “语言”和“地区”是预定义变量 所以我们不需要自己定义它们 而“食物”就是我们上面定义的变量 你将注意到在定义变量时 它的名称是用引号表示的 这是因为这是 JSON 键的语法 在模式中 它是用一个美元符号和括号包裹的 我们可以交付 但有一个问题 我们不能在加拿大销售 我们的 app 或产品 因为我们很难保证枫糖浆的供应 所以我们将在 必须匹配 ISO 区域代码 CA 之前 添加另一个对应于加拿大的模式 我们将此模式标记为“排除” 它告诉操作系统 如果 URL 与此模式匹配 就不应该作为通用链接被此 app 打开 这样 我们仍然可以排除变量值的 单独组合 然而 Jonathan 出生在加拿大 他很想回国做生意 假设我们保证了枫糖浆的供应 当然 所有这些糖浆般的美味 意味着加拿大需要一份 不同于我们经营的其他国家的菜单 我们该如何处理他的替代变量中的 特殊情况? 这并不难 我们只是添加了另一个变量 “加拿大食物” 专门用于加拿大 你马上就会注意到菜单之间有一些重叠 那也没关系 你也会注意到我们保持了 原有的排他性模式 如果我们要删除它 那么最后一个模式将匹配来自加拿大的 “食物”变量的所有值 这不是我们想要的结果 我们已经准备好部署这个文件了 但加拿大是一个多语言国家 那里不是每个人都说英语 我们至少应该要支持英文和法文 所以我们要加上那些 加拿大食物名称的法文翻译
哦 看起来很奇怪 其中一个法国食物的名字有一个重音字母 这意味着我们需要处理百分比编码 让我们弄好它 啊 好多了 我们可以使用我们今年推出的 百分比编码密钥 它允许我们在模式和变量中 直接使用重音字母 我们弄好了 现在我饿了 很快就能用上这个 app 点午餐了 因为替代变量现在是可用的 在 macOS Catalina 10.15.6 和 iOS 13.5 更新中已提供 既然我们已经讨论了 apple-app-site-association 的 文件内容 那么让我们来谈谈 它是如何进入用户设备的 以及要如何改善这种流程 (优化首次发布体验) 假设我们有一台 iPad 我们想下载一个 app 我们打开 App Store 选择想要下载的 app 找到了
下载并安装 app 后 系统检查其应享权限 并发现它需要 一个或多个 apple-app-site-association 文件数据 设备打开到承载该文件的 Web 服务器的连接 以便下载该文件 现在 设备的带宽有限 因此 如果需要从多个 Web 服务器 下载多个文件 设备需要一次下载几个文件 apple-app-site-association 文件 从 Web 服务器到进入设备 由关联域守护程序解析 app 的通用链接也会活跃起来 然后设备移动到下一个排队的服务器 依此类推 但如果下载有问题怎么办? 让我们回到这里的几张幻灯片 并再次尝试下载那个文件
设备尝试建立到服务器的连接 但假设 Wi-Fi 中断或服务器崩溃 或者根本无法从设备访问服务器 下载的程度取决于故障的确切性质 但数据不会传到设备上 最终 设备不得不放弃下载 然后转到下一个服务器 这会使设备处于不一致的状态 即虽然安装了 app 但它的通用链接 和其他关联域数据不可用 这种状态可能持续数小时或数天 直到系统下次尝试更新该 app 的数据 但我想我们可以在这里做得更好 让我们再次回顾几张幻灯片 但这一次 我们有十足的把握 我们再次在 App Store 上选择一个 app 然后下载到这个设备上 此设备会看到 app 具有关联域权限 但没有连接到关联的 Web 服务器 而是连接到管理关联域数据的 内容传递网络 即 CDN
CDN 是一种功能强大的工具 可以缓存大量数据 因此它可能已经存储了 来自该 Web 服务器的数据 但假设它没有存储 它可以代表该设备连接到服务器 但 CDN 也很强大 因此它可以同时连接到该设备上 所有 app 的所有服务器 它可以同时下载所有这些域的 apple-app-site-association 文件 然后缓存它们 并通过单个网络连接将数据发送到设备 这个设备看起来 比我们上次尝试的时候要愉快多了 (使用 CDN 的好处) 想要使用 CDN 的原因有很多 我们已经构建了一个 CDN 可专门用于关联域 和 apple-app-site-association 文件 对它进行微调 然后为用户提供最好的体验
由于 CDN 缓存 来自多个 Web 服务器的数据 所以我们可以使用一个 HTTP/2 连接 来请求所需的所有数据 而不是为每个 Web 服务器 使用单独的连接 缓存可以减少服务器上的总负载 从每天可能的数百万次请求降低到 仅有的几次请求 而且 CDN 以顺畅快速的连接著称 总体上让用户拥有更安心的 app 体验 从 macOS Big Sur 和 iOS14 开始 你的 Web 服务器将只接收来自 Apple CDN 对 apple-app-site- association 的文件请求 该 CDN 位于公共互联网上 但是 并不是所有的服务器都是平等的 如果你的 Web 服务器无法 从公共互联网访问 该怎么办? 可能是你用于部署前测试的 Web 服务器 或者是仅供连接到内部网络的员工 使用的 Web 服务器 如何继续支持这些场景?
我们在 CDN 支持中 设计了一些特性来帮助你 我们称之为“替代模式” 替代模式允许你绕过 CDN 直接连接到你控制的域 在 macOS Big Sur 和 iOS 14 中 有两种替代模式 它们的区别在于你何时使用它们 第一种替代模式称为“开发者模式” 它是在你将 app 部署到 TestFlight 或最终用户之前 专为构建和测试 app 而设计的
第二种替代模式称为“托管模式” 用于使用 MDM 配置文件安装 app 期间 今天我们将集中讨论开发者模式 有关管理设备和配置 MDM 配置文件的 更多信息 请观看《管理 Apple 设备》 与开发者模式的首要区别是 在启用后 你可以在 Web 服务器上使用 任何有效的 SSL 证书 即使它不受操作系统内置证书存储的信任
这比听起来更强大 因为如果没有预防措施 它可能允许中间人攻击 使你的用户容易受到许多安全问题的影响 我们要求用户在使用它的任何设备上 选择进入开发者模式 在 iOS、watchOS 和 tvOS 上 选择加入看起来与此类似的模式
打开设置 app 选择开发者设置 它们将在你的设备第一次连接到 运行 Xcode 的 Mac 之后出现 在“开发者设置”下 启用“关联域开发” 此设备现在配置为开发者模式
而在 macOS 上 这个过程则稍微不同 打开 Terminal 并输入 你在此处看到的命令 swcutil developer-mode -e true 系统将提示你 输入管理员密码或触控 ID 授予权限后 启用开发者模式 这是针对每个用户的操作 (内部域的替代模式) 因为开发者模式是全局切换 我们不想为所有的应用都启用它 除非是你正在开发的 app 所以它只对使用开发配置 文件签名的 app 生效 在 App Store 或 TestFlight 上 签名发行的 app 或者已经签名和公证的 Mac app 不能与此替代模式一起使用
最后 开发者模式和托管模式 要求你托管 apple-app-site-association 文件 在 .well-known directory 目录中 而不是在域的根目录中
这是替代模式以及如何在设备上 启用模式的很好总结 但是如何告诉系统你的 app 要在给定的域中 使用这种替代模式呢? 让我们看看关联域权限 此权限目前支持 www.example.com
很典型 现在让我们为这个 app 启用开发者模式 和托管模式
我们为这些替代模式添加了 单独的权限条目 我们选择的域名只是示例 它们不需要与面向公共的领域区分开来 也不需要彼此区分开来 你使用的域名将特定于你的组织
这些新的权限条目包括一个名称为 “模式”的查询项 以及一个指定要使用的替代模式的值 我们添加的第一个权限值指定 可以在开发者模式下访问此域 第二个表示可以在托管模式下访问它 那第三个呢? 当此设备同时处于开发者和托管模式时 可以访问此域 你可能希望在构建内部 app 时 使用此配置 我们今天学习了很多新内容 我们支持带有 WatchKit 的 watchOS 以及 SwiftUI 的所有平台 我们增加了几个新的模式匹配特性 包括替代变量 以帮助你建立高效、有效的通用链接 我们还推出了一款新的 CDN 可以加快和简化下载 apple-app-site-association 文件过程 我们期待着能看到 你用这些新工具所构建的内容 谢谢
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。