WWDC2019:What's New in Universal Links
WWDC2019 Session 717 : What’s New in Universal Links
上面是 session 视频原 link ,整个视频不长,也就 20min
视频脉络
- OverView 总览
- Configuring Your Web Server 配置网络服务
- Configuring Your App 配置应用
- BestPractice 最佳实践
OverView 总览
Universal Link 的基本运作机制
- 通过在 XCode 的 App 配置中配置了相关信息以及安全域名指定
- 通过在 Https only 的安全域名上部署一个配置 json ,包含证丰富的 website 与 app 的链接信息
- 建立起了安全又有效的 website 与 app 的握手机制
- 实现 website 的 url 与 app 的直接联动
相对于自定义的 schemes 来说 Universal Link 能带给你更安全更流畅的体验
补充:schemes 上最令人诟病的就是 app 劫持,很多 app 会冒充注册知名大厂的 app scheme 从而拦截调常规的大厂 scheme 唤起,这一点在 Universal Link 就能很好的避免
What’s new ? 新特性
Universal Link 之前只支持 iOS tvOS 平台,现在全面登录到 macOS 平台上了,无论你是用 UIKit 还是 AppKit 开发的 Mac App 都可以使用 Universal Link
Configuring Your Web Server 配置网络服务
- 必须支持 https:
必须是正规证书,不能使用自定义证书
- 添加 apple-app-site-association file:
当 app 安装到设备的时候,会从配置域名上下载这个 json file 到本地,从而根据配置生效相关的功能。并且设备上下载的这个 json file 会不定期的更新
笔者注 1:这个 json file 不仅仅可以支持 Universal Link ,关于跨设备联动 Hand off 等功能也是依赖这个 json file
笔者注 2: 亲测过,app 发布版本更新的时候也会触发 json file 的更新
- apple-app-site-association file 在域名下的位置
必须是 https://your-domain/.well-known/apple-app-site-association 这个路径,其他路径无法生效
笔者注 3:以前要求必须是域名根目录下,也就是 https://your-domain/apple-app-site-association ,这次看起来有所更改
笔者注 4:苹果曾经讨论过必须要对 json file 签名,但现在不再需要签名这一步了
What’s new ? 新特性
apple-app-site-association file 的写法变更
上图是用知乎的 apple-app-site-association file 的老写法示例
这是新的写法,支持了更多更强的配置能力
- apps 这个字段只有在 iOS 上有用,tvOS/macOS 这个字段可以忽略
- details 字段结构大幅度变化
- 以前是字典 appID 为 Key,现在是数组,并且支持 appIDs 这样的 key,可以一套配置适配多个 appID,大幅度减少工作量
- 新增 components 字段,可以进一步约束 universal link 的生效条件
- 可以通过 / 来配置支持的 path 格式条件
- 可以通过 # 来配置支持的锚点条件
- 可以通过 ? 来配置支持的字段条件
- exclude 是排除字段,符合这个条件的 universal link 不生效
视频中还有更详细的 components 字段配置说明,左边是 components 配置,右边是匹配的 url 格式
More Tips 服务配置建议
- URL 使用 ASCII 编码
因为在 URL 中会使用很多符号诸如 # ?% 要使用 ASCII 编码
- 减少 apple-app-site-association file 的大小
减少大小有助于在拥堵的网络条件下,更顺畅的生效 universal link。如果你的应用面向不通的国家,针对不同的国家有不同的配置文件,可以通过国家标记符来分别配置,从而让用户只下载最精简的 json file
Configuring Your App 配置应用
XCode 有了全新的 Universal Link 配置页面,不过本质上还只是一个 XML 配置文件
- 支持配置子域名
- 支持配置父域名(子域名优先)
- 支持配置特殊字符的域名,但必须 Punycode 编码
在支持 macOS 的情况下,appdelegate 的 universal link 的处理也是这个 delegate,区别只是 UIApplication 变为 NSApplication
由于这个 delegate 会由很多其他的快捷方式触发,不仅仅由 universal link 触发,所以通过 NSUserActivityTypeBrowsingWeb 来判断来源
剩下的就是标准的 url 处理了
What’s new ? 新特性
macOS 下 universal link 的差异
- 默认打开网页,会提示用户是否需要打开app
- 远程登录下无法生效
- 唤起开发者签名 app 优先级大于唤起 appstore 签名 app
在 mac app 中打开一个 universal link
BestPractice 最佳实践
- 处理好失败 Fail Gracefully
universal link 生效的时候,请小心的处理好各种数据,传参等原因导致的错误
- 使用 Smart Banner
网页中的 Smart Banner 可以有效的引导未安装 app 的用户前往下载,已安装 app 的用户就可以顺畅使用 universal link
- 给苹果反馈
如果你有更多对 universal link 的建议,欢迎反馈
PS: 我以前写过的一篇 UniversalLink 的部署实践: