Universal Link on iOS

什么是 Universal Link

URL Scheme

众所周知,从 web 到 app 之间的跳转可以使用 URL Scheme 的方式实现,但是这种方式存在一定问题:

  • 无法得知跳转结果:如果 app 没有安装导致跳转失败,web 端不能知道跳转是否成功。这样就无法满足「如果安装了 app 就跳转到 app,否则跳转到安装页面」这样的需求。也有人通过打开 URL Scheme 链接后延迟 1 秒打开下载页的方式,但用户跳转到 app 后再切到浏览器还是会跳到下载页,不够优雅。

  • 系统弹框体验差:在 iOS 9 之后苹果在跳转时会弹出一个提示框问用户是否要打开 app。

  • Web 容器的封锁:许多 app 为了不给其他 app 导流量,禁用了 URL Scheme 的跳转。悲剧的是 Universal Link 也被微信封锁了,想必是一种趋势。

Universal Link 是 Apple 从 iOS 9 引入的一种打通 web 和 app 之间跳转的机制。在 Safari 或者 webview 中打开与 app 关联的链接时,会自动跳转到 app 并且不丢失参数内容。Universal Link 解决了 URL Scheme 的部分问题:

  • 当跳转失败时,会直接在 Safari/webview 中打开链接。
  • 考虑到众多 app 都实现了组件化,可以借助 Universal Link 统一 web 端和 native 的路由。
  • 跳转时不会弹出提示框,体验更好。

Universal Link 使用

要使用 Universal Link,要将域名和 app 关联起来,这个关联是双向的:

  • 域名对 app 的认证:在 web 服务器根目录放一个名为 apple-app-association 的文本文件,里面描述哪些路径会跳转到哪个 app。具体见 Apple 文档
  • App 对域名的认证:在 Xcode 里设置 Associated Domains,将域名添加进去。

注意域名必须通过 HTTPS 访问 Universal Link 才能生效。

跨域

要通过 Universal Link 实现跳转有一个前提:必须跨域。比如当你打开一个知乎的 web 页面时,链接是

1
https://zhihu.com/question/abcd1234

如果页面中有一个链接是:

1
https://zhihu.com/people/efgh

这个时候是无法跳转到 app 的(会直接在 Safari 或者 webview 打开页面)。实际上知乎采用一个专门的二级域名来完成跳转:

1
https://oia.zhihu.com/questions/abcd1234

左上角返回

在跳转到 app 之后,系统状态栏右上角可以跳转回浏览器,如果用户点击这里返回浏览器,那么下次打开相同路径(其他路径不受影响)就不再跳转了。这点我并没有验证。

更新时机

系统会在 app 初次安装、升级时去对应的域名下拉 apple-app-association 文件,如果你的 Universal Link 不工作,而配置都正常的话,可以尝试重启手机或重装 app。

参考

给鸡排饭加个蛋