大多数浏览器和
Developer App 均支持流媒体播放。
-
通用链接的新功能
通用链接让您的用户可以智能地利用链接来访问您的 app 或网站中的内容。了解通用链接的最新增强功能如何为您的用户提供高度整合的移动和桌面体验,即使他们的设备上没有安装您的 app。
资源
- Allowing apps and websites to link to your content
- Associated Domains Entitlement
- Shared Web Credentials
- Supporting Associated Domains
- Universal Links for Developers
- 演示幻灯片 (PDF)
相关视频
WWDC20
WWDC19
-
下载
(通用链接的新功能) 欢迎参加我们的通用链接课程 我叫Jonathan Grynspan 我在Apple的核心框架团队工作
今天 我将向您展示如何在 您的app中使用通用链接 我们在IOS 9中引入通用链接 作为在网络和app中 提供丰富内容的好方法
今天 我将向您展示我们 已经完成的增强功能 无论您是已经在iOS app中采用了通用链接 还是正在将它们添加到 macOS app中 您都需要密切关注我将要讨论的变化
首先 我们来谈谈什么是通用链接
通用链接是HTTP或 HTTPS URL Apple的操作系统将其识别为 指向网络或app中的资源 无论是在网上还是在您的app中 这意味着 无论您的用户是否 安装了app或者只是还没有下载 一个URL都可以表示该内容 它们是提高用户在app中 参与度的好方法
iOS 9和tvOS 10中 引入了通用链接 我很高兴地宣布 无论您使用的 是AppKit还是UIKit 我们都将向他们 介绍带有macOS 10.15的 Mac 我一会儿再详细介绍 通用链接在您的app 和网站之间是安全关联的 您的app在Xcode中采用了 一个权限 指示它可以代表哪些域 您的网络服务器采用了 一个JSON文件 该文件包含了关于您的app中 可以表示其域的哪些部分的更多细节 这种双向安全握手确保没有人 可以将用户重定向到他们 的app而不是您的app
我们建议您现在使用自定义URL 方案的地方从今天开始 迁移到通用链接 自定义URL方案本质上不安全 并且可能被恶意开发人员滥用 强烈建议不要使用自定义网址方案
既然我们已经知道了什么是通用链接 让我们来讨论一下如何构建它们 我们将从您的网络服务器开始
您的网络服务器必须 有一个有效的HTTPS证书 HTTP不安全 不能用于验证 app和网站之间的关联
用于签名HTTPS证书的根证书 必须被操作系统识别 不支持自定义根证书
生成证书并配置服务器之后 添加Apple-app-site-association文件 这是一个JSON文件 稍后我们将讨论这种格式 当您的app安装在 Apple设备上时 操作系统将下载该文件 以确定服务器将允许您的 app使用哪些服务 系统还定期下载此文件的更新 通用链接是这个文件中 可能包含的许多服务之一
这个文件应该位于 HTTPS:// 您的域名 /.well-known /apple-app-site-association 不推荐使用其他路径 过去 我们讨论过注册您的 apple-app-site-association文件 这从来不是支持普遍联系的必要步骤 所以现在它被弃用了
支持已签名的JSON文件 其他路径的JSON文件 将在将来的版本中删除
这就解决了 让我们看看您的 apple-app-site-association文件 如果您的网络服务器上 已经有这些文件之一 那么这看起来可能很熟悉 但是 我们今天要介绍一些变化 顶层是字典 其关键字是服务类型 对于通用链接 关键是applinks 就像您在这里看到的一样 但是也可以使用其他服务 我们将只关注通用链接 在顶层的键下面是 Apps键和Details键 如果您的目标是iOS 13 tvOS 13和 macOS 10.15 您不需要Apps键 所以可以删除它 如果您继续提供支持 对于iOS 12、tvOS 12 或更早版本 您仍然需要它 对于通用链接 它应该总是一个空数组
Details键包含一个字典数组 每个字典代表 一个特定app的通用链接配置 过去 我们在这里支持使用字典结构 而不是数组 但是这种配置已经过时了
在Details键下面是一个appID键 它的值是您的app标识符 您的app标识符由一个 由Apple提供的字母数字 10字符前缀 .和一个bundle标识符组成
前缀可能等于也可能不等于 您的团队标识符 检查开发人员门户以确认 您的app标识符 如果您有多个具有相同通用链接配置 的app 您可能不想重复相关的JSON 如果您的目标是今年的发行版 您可以使用复数appIDs键 来减小该文件的大小 该键的值是一个app标识符数组 如果您需要支持以前的版本 您应该继续为每个app 使用单一的appID键
接下来是路径键 此键包含路径模式数组 模式匹配与在终端中执行相同的方式 星号用于表示多个通配符 而问号只匹配一个字符
从今年开始 我们将用组件键替换路径键
此键的值是一个字典数组 其中每个字典都包含零个 或多个URL组件 以进行模式匹配 与前面一样 您可以匹配URL的路径组件 该组件的键是正斜杠 如果需要支持以前的版本 可以保留路径键 iOS 13、tvOS 13 如果组件键存在 macOS 10.15将忽略它
现在 您可以匹配URL的 Fragment组件 它的键是散列标记 您还可以匹配Query组件 它的键是问号 现在 很多URL 如果不是大多数的话 将查询组件分成键值对 称为查询项 对于查询组件 可以指定字典而不是 字符串作为其值和模式匹配 的单个查询项 模式匹配单个查询项 URL可以重复查询项名称 并且操作系统将要求给定查询项 名称的所有实例都匹配您的模式 没有值的查询项和没有查询项的 查询项由操作系统处理 就好像它们的值等于空字符串一样
要使组件字典匹配候选URL 所有指定的组件必须匹配 如果不指定组件 操作系统的默认行为 就是简单地忽略那个组件 例如 如果您的app不关心 URL的Fragment组件 您不需要在此文件中指定它 您的网站可能有一些部分 还不能在您的app中显示 您可以通过使用布尔值True 指定Exclude键 来排除这些子部分 此键具有与在旧路径键中 使用的Not关键字相同的行为 在使用组件字典时不支持该关键字
这里有几个URL示例 我们需要它们进行模式匹配 我正在开发一个订餐app 我使用通用链接将用户 从Safari带入我的app 在左边 您可以看到来自我的服务器的 一些JSON 在右边 您可以看到一些URL 首先 我想匹配我网站上 所有的订单表单 它们都位于一个路径上 其中第一个组件可以是任何东西 第二个组件是Order 之后就没有其他的路径组件了
此模式将匹配一个URL 如右边的这两个 午饭时间到了
接下来 我知道我的很多顾客 会想在他们的玉米饼上放奶酪 因此 我将匹配路径 以路径组件玉米饼开始的 任何URL 以及指定名为 奶酪的查询项的URL 您将注意到 我从查询项的值中 指定了一个问号和星号作为模式 由单个星号组成的模式 匹配任何字符串 包括空字符串 而缺少的查询项 具有与空字符串等价的值 因此 要匹配 至少一个字符长的字符串 我指定一个问号 然后用星号匹配任何其他字符 与我们的第三个URL相匹配
第四个和第五个URL 看起来非常相似 但这是有原因的 我的网站也有很多四位数 的优惠券代码 app可以处理 但如果它们以1开头 我希望它们留在浏览器中 因为操作系统将从上到下 查看可用的模式 所以我们首先将以1开头的 优惠券代码标记为排除
这告诉系统 如果找到匹配项 就停止在这里查找 但不要将URL作为通用链接打开 然后 任何其他优惠券都将匹配 第四个也是最后一个组件字典
在我们进入您的app之前 让我们来讨论一下如何支持国际观众
URL始终使用ASCII编码 所以组件匹配也是用 ASCII码完成的 如果需要匹配当前的 Unicode字符 并像在URL中那样对它们进行编码 由于存在组件并对其进行编码 Unicode字符可以由 多个ASCII字符表示 当您构建JSON时
您可能想为您支持的 每个国家提供特定于 国家的模式 这大大增加了JSON的大小 如果国家之间的模式匹配是一致的 则可以通过简化JSON 来减少服务器之间的流量 例如 如果您使用两个字母 的国家代码来分隔内容 那么您只需要指定 您以前使用这些国家代码的 地方的两个问号 其他更复杂的模式 就像您在这里看到的 也可以很容易地匹配 如果遇到带有无效国家代码 或特定于语言环境的标识符的URL 请将其视为用户的当前语言环境
从这个版本开始 操作系统将根据 用户最可能浏览的位置对 apple-app-site-association 下载进行优先级排序 我们仍然会在安装app时下载它们 但是优先级不同 顶级域名.com .net和.org 是高优先级域 因为它们占了全球互联网流量的 很大一部分 国家代码TLD 也称为ccTLD 如果国际化的TLD 与用户当前的语言环境 设置匹配 那么它们也会被优先化 例如 中国的普通用户 访问中国ccTLD下的域名的 可能性比访问意大利或俄罗斯 ccTLD下的域名的可能性更大
因此 现在您的服务器 已经准备好支持通用链接 让我们更新您的app
在Xcode中打开项目 并导航到项目设置 添加关联域功能 这将向选定的目标添加一个新的权限 您可以直接从该视图修改此权限
此权限的值是表单服务 类型冒号域名的字符串数组 对于通用链接 服务类型是applinks 就像在您的 apple-app-site-association文件中一样 这个数组中的值的顺序被系统忽略
在这里 我们声明 您的app支持通用链接 例如www.example.com 当您的app被安装时 操作系统将访问 www.example.com 寻找我们刚刚讨论过的 apple-app-site-association文件 如果它存在 并且它包含这个app 的app标识符的信息 那么关联就被确认了 还可以指示对给定域的子域的 通配符支持 如下所示 在本例中 此时操作系统将访问 example.com 这次没有www
在通用链接查找期间 精确域比通配符域 具有更高的优先级 在这种情况下 这意味着当一个系统 在www.example.com 上打开URL时 它会尝试在从父域获得模式 之前匹配该域的模式 只有在完全限定子域中 没有找到匹配项时 才会匹配来自父域的模式
最后 这里是一个国际化域的例子 因为URL总是ASCII 您的国际化域名将需要使用 Punycode进行编码 有关Punycode的更多信息 请参见RFC 3492
现在 您的app声明了对某些域 的支持 您需要在 URL进入时解析它们 通用链接是基于 Foundation 的NSUserActivity类 由app委托处理 您将需要一个处理程序 来处理传入的用户活动 如果您已经支持传递 或者其他 类似的技术 您的app委托中 可能已经有了这个方法 该方法返回一个Bool 如果您能够成功打开用户活动 则返回True 如果不能 则返回False
如果您正在使用 UIScene 就可以使用类似的委托方法 如果您正在使用AppKit 这个方法的签名几乎是相同的 就像您在这里看到的 用NS替换UI 在此会话的其余部分 我们将使用UI app
接下来 我们将检查活动类型 是否为NSUserActivityTypeBrowsingWeb 这有助于将通用链接与app 可能支持的其他传入 用户活动区分开来 即使您现在不支持其他活动类型 检查活动类型也是一个好主意 以防将来需要支持其他类型
活动类型看起来不错 让我们从用户活动对象 获取网络页面URL 对于一个通用链接 它永远不会是nil 让我们从URL构建一个URL 组件结构体 您应该始终使用URL组件 解析URL 使用正则表达式或手动解析URL 字符串可能会使您容易 受到安全问题的影响
我们已经通过了guard语句 所以让我们检查URL的内容 在本例中 我对URL的查询项很感兴趣 但此时您可以使用URL的 任何组件来根化活动 如果您支持来自多个域的 通用链接 不要忘记检查主机组件
我们的代码已经完成 服务器也配置好了 但是在macOS上使用 通用链接时存在一些差异 默认情况下 macOS上的 通用链接在浏览器中打开 当它们打开时 Safari会给 用户在app中打开它们的选项 如果用户选择此选项 之后 您的链接将继续 在您的app中打开
与iOS不同 macOS支持 启动远程卷上的app 远程卷上的app不能使用通用链接 它们必须安装在本地
如果用户从App Store 下载您的app 系统将在您的app安装或更新后 立即开始下载 apple-app-site-association文件 如果您的app 是开发者ID签名的 在用户至少启动一次app之前 系统不会开始这些下载
因为通用链接由与app标识符 的安全关联支持 所以给定app 只有一个副本能够处理 Mac上的通用链接 通常 这将是/applications中 app的副本 当您需要测试相关域权限 的更改时 请记住这一点 如果您在操作的另一端 并且想要 打开一个通用链接UI app NSWorkspace 和Launch Services 都会在可用时自动打开它们
如果您想在一个app中打开 一个通用链接而不是默认的浏览器 您可以适当地使用UI app 或NSWorkspace API 如果这些打开操作失败 则意味着提供的URL 不能使用通用链接
如果您正在为macOS 开发网络浏览器 将提供额外的API 来帮助您支持通用链接
为了帮助您做出最好的app 并提供最好的用户体验 我有一些最后的技巧与您分享
首先是优雅地失败 可能会向您提供表示过期、无效 或不存在内容的URL 如果您确定一个通用链接 不能被您的app打开 您可以经常在Safari 视图控制器中打开它 这可以让用户参与您的app 如果Safari视图控制器 不是选项 考虑在Safari中打开URL 或者至少提示有关问题的详细信息 避免将用户发送到空白屏幕
若有人访问您的网站 请使用Smart App Banner 提供到 App Store或 您的内容的链接 Smart App Banner与 Safari无缝集成 看起来很棒 而且不需要JavaScript 或自定义URL模式来支持它
最后 如果您有关于我们如何 改进通用链接的反馈 我很乐意听到 请使用反馈助手 让我们知道我们能做些什么 来让通用链接更好 谢谢
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。