1. 给服务器添加 HTTPS 证书
添加完成的网站之前使用的 URL Scheme 存在安全风险,所以 Apple 更加推荐使用新技术 Universal Link 来完成 App 之间的跳转;
Universal Link 不再使用 App 内嵌配置 URL Scheme ,而是通过 HTTPS 请求服务器来获取的 Scheme/applinks(可以认为是跳转标识)。HTTP 不安全,而本地的方式不管哪个 App 都可以随意设置,所以 Apple 最终要求采用 HTTPS 的方式来请求 App 对应企业的自有服务器来获取这个跳转标识,规避了安全问题;
Universal Link 技术是基于 HTTPS 实现的。HTTPS 是计算机网络基建项目一般的存在,Universal Link 基于 HTTPS 来实现 App 之间的跳转以此来避免安全问题,这种思想值得借鉴;
HTTPS 配置参考密码学中的相关文章:在Nginx中配置SSL证书
2. 生成 apple-app-site-association 文件
apple-app-site-association 的配置方式其实是有两种版本的:
- iOS13 以上更建议使用 component 的方式;
- 如果还需要支持 iOS13 一下,则使用 path 的方式;
另外,apple-app-site-association 的具体使用不再赘述,具体可以参考网上博客,或者自己去看对应的 WWDC,这里就上一个比较常用的配置吧:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
"apps": [] 就是一个空数组,对于我们开发者而言,没有什么意义。iOS13 以上可以省略,但是 iOS13 以下不能省略!!!
3. 服务器中添加 apple-app-site-association 文件
配置 apple-app-site-association 并将该文件添加到服务器中的 domain/.well-known/
对应位置:
4. 配置 Xcode(entitlement)
在 Xcode 中配置 appLinks
配置applinks
这里设置的如果是
kangxiaocao.top
,那么整个流程的域名都应该不带www.
。这本质上是域名的基础概念问题,不再赘述;
5. 测试
假设上文的 path 配置的是:"paths": [ "test1", "/qq_conn/test2/*" ]
按照如下步骤进行测试:
- 测试
https://www.kangxiaocao.top/.well-known/apple-app-site-association
中能否下载到对应的 json 文件; - 上一步中只能使用 HTTPS 请求,这也是为什么需要给服务器配置 HTTPS 证书;
- 访问
https://www.kangxiaocao.top/.well-known/apple-app-site-association
,确认能够下载到对应的 JSON 文件; - 确认 JSON 无误之后,重新卸载安装 App;
- 备忘录中分别打开
https://www.kangxiaocao.top/test1
和https://www.kangxiaocao.top//qq_conn/test2/xxx
来对上述的两个 path 进行验证,如果跳转成功则证明设置正确;
5. 添加引导页
Universal Link 的应用场景有几个:
- 从 微信、QQ 跳转到 App;
- 从短信、safari 、备忘录等系统软件直接跳转 App;
- 从 H5 页面跳转到 App(本质还是safari);
微信、QQ 现在一般都是支持 URL Scheme 和 Universal Link 两种方式的。所以第一种场景直接在微信、QQ 的分享平台生成相应的配置后,需要添加到 Xcode 中(URL Scheme 需要)。另外,代码层面也需要进行一些处理,具体不再赘述;
第二、三种场景仍然可以通过 URL Scheme 和 Universal Link 两种方式实现,只不过有些许差别;
URL Scheme 的方式只能通过 safari 来完成跳转,本质上是:
- App 内部添加 URL Scheme;
- App 安装后备添加到系统级别的一个配置表中;
- 使用 safari 打开类似
Scheme:
这种网址,系统识别到之后去配置表中匹配,如果匹配到了对应的 App(identifier),则启动对应的 App,并调用相关方法传递参数;
所以,在短信内通过 URL Scheme 来跳转,必须先打开 safari,safari 内部再调用 URL Scheme 来跳转 App,或者是跳转 App Store;
类似的应用有:京东、嘀嗒等;
貌似 URL Scheme 在 App 未安装的情况下可以直接跳转 App Store?具体没怎么用过
如果通过 Universal Link 实现,则体验更好:
- 安装了 App,直接打开并调用相关方法传递参数;
- 未安装 App ,使用 Safari 打开对应页面;
即:安装了 App 时不需要 Safari 这个中间媒介来打开 App;
所以,无论是使用 Universal Link 还是 URL Scheme ,都需要一个 H5 引导页,这个页面的作用是:
- 使用 URL Scheme 时,通过 safari 跳转 URL Scheme 来打开 App 或者引导用户跳转 App Store;
- 使用 Universal Link 时,App 未安装的情况下,引导用户跳转到 App Store;
所以,最关键的一点来了:
⚠️使用 Universal Link 时,该引导页需要被嵌入到 applink 对应域名下可用的 path 中⚠️
这句话里有两个重点:
- 该网页必须被嵌入到 applinks 对应的域名下,也就是 Xcode 中配置的
www.kangxiaocao.top
; - 该网页必须配置到可用的 path 下,也就是
apple-app-site-association
文件中设置的可用 path 下;
这样就完成了 Universal Link 的完整功能:
- 安装了 App 时,通过 domain + path ,系统软件内部能够直接跳转到 App;
- 未安装 App 时,通过 domain + path ,跳转到 Safari 打开对应的引导页;
还没理解的话,可以顺着这个思路:首先如果使用 Universal Link ,那么就只用使用
domain/path
的路径来完成跳转。另外,又需要一个引导页,所以这个引导页必须发布到后端服务器对应的 path 中,或者使用前端路由到这个引导页;
6. 原理
- iPhone 第一次安装 App 时,系统会拿到该 App 内的 entilement 文件(由 Xcode 相关设置生成,也可直接在文件内添加配置,Xcode13之后貌似不用了);
- 根据该文件中的键值对
applinks:domain
取到对应的域名www.kangxiaocao.top
; - 去
domain:.well-known/apple-app-site-association
中下载 JSON 文件,也就是上文中的https://www.kangxiaocao.top/.well-known/apple-app-site-association
; - 文件下载完毕后,检测
apple-app-site-associatio
n 中 AppId 数组中是否包含该首次安装的 AppId,如果包含,则确定绑定关系,在系统级别的文件中添加记录; - 系统级别的软件使用
domain:path
打开链接时,走路由转发时会有一层判断,如果该 path 在系统级别的记录表中存在 appId 的记录关系,则跳转该 App;
7. 微信原理解析
微信分享需要几个前置配置:
- 微信开放平台上配置 AppId 对应的 Universal Link;
- WXSDK 中设置Universal Link;
WXSDK 内部应该有一定的机制来请求后台,获取 AppId 对应的 Universal Link,这个估计就是数据库哈希查询吧。如果和 WXSDK 初始化时使用的 Universal Link 不符合,则会存一个标志,分享到微信时,直接弹出 Universal Link 不一致的页面,拦截跳转;
即:微信的社会化分享、支付、登录等的跳转和工程中的 applinkurl 没有什么关系;
微信 H5 页面跳转到 App 依靠系统自带的 Universal Link 体系即可,需要配置:
- App 工程中配置 applinkurl;
- applinkurl 对应的域名中添加好配置文件;
- H5 页面按钮调用对应的跳转域名(如 <a> 标签的方式);
即:微信 H5 页面跳转 App 和微信的 SDK 跳转体系无关;
总结:微信需要通过后台和 WXSDK 的 Universal Link 的一致性来决定是否提供生态(要给钱)。而微信中的 H5 通过 scheme 或者 Universal Link 跳转到 App,这个本身就是 iOS 系统提供的功能,微信最多是做了一层中转,甚至是直接透传(甚至只是没有拦截而已);
但是!!!上述两者需要组合到一起,且配置统一,此时就能完成 App -> 微信、微信 -> App 的闭环;
8. 注意点
- apple-app-site-association 中的 path 配置时,最好不要重复设置同一个 AppId 对应的 path,猜测可能是前面的 path 优先级更高,后面的 path 优先级低,会被忽略。(这里指的是同一个 AppId,而不是多个 AppId):
-
apple-app-site-association 是可以配置多个 App 的,也就是可以多个 App 的 Universal Link 方案公用一套 apple-app-site-association + domain + HTTPS 的方案。避免出现上文说的 appId 重复的情况即可;
-
最后,还要说一下,如果这个 domain 不是专门为了 Universal Link 申请的,那么 path 中最好不要直接使用
*
。因为使用*
时,该域名下所有的 URL 在系统软件中打开时,都会直接跳转 App。有些场景如 safari 中打开某个 URL 并不是要跳转 App,那么如果配置的 path 是*
,这种情况下也会直接跳转 App,可能会引起一些问题; -
测试时,相关的 URL 最好使用复制粘贴到备忘录的方式来进行跳转测试。因为下划线、横线等符号如果出错或者使用了中文下的符号,就会很尬,会导致测试失败且查不到问题出在哪;
这项技术变化其实挺快的,最好参见 WWDC + 自己配置 Nginx 的方式来做验证;
URL Scheme 的安全性问题:
总结:Universal Link 本质上是将 URL Scheme (跳转标识)的设置从本地的 Xcode(plist)转移到了企业的服务端,利用了域名具备唯一性和归属性来解决了跳转标识唯一性问题,利用 HTTPS 解决了传输过程的安全问题;
网友评论