之前使用的 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": [ "*" ]
}
]
}
}
3. 服务器中添加 apple-app-site-association 文件"apps": [] 就是一个空数组,对于我们开发者而言,没有什么意义。iOS13 以上可以省略,但是 iOS13 以下不能省略!!!
配置 apple-app-site-association 并将该文件添加到服务器中的 domain/.well-known/
对应位置:
在 Xcode 中配置 appLinks
配置applinks5. 测试这里设置的如果是
kangxiaocao.top
,那么整个流程的域名都应该不带www.
。这本质上是域名的基础概念问题,不再赘述;
假设上文的 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 打开对应页面;所以,无论是使用 Universal Link 还是 URL Scheme ,都需要一个 H5 引导页,这个页面的作用是:
使用 URL Scheme 时,通过 safari 跳转 URL Scheme 来打开 App;2. 使用 Universal Link 时,App 未安装的情况下,引导用户跳转到 App Store;所以,最关键的一点来了:
使用 Universal Link 时,该引导页需要被嵌入到 applink 对应域名下可用的 path 中;这句话里有两个重点:
该网页必须被嵌入到 applinks 对应的域名下,也就是 Xcode 中配置的www.kangxiaocao.top
;该网页必须配置到可用的 path 下,也就是 apple-app-site-association
文件中设置的可用 path 下;
这样就完成了 Universal Link 的完整功能:
安装了 App 时,系统软件内部能够直接跳转到 App;未安装 App 时,跳转到 Safari;6. 原理 iPhone 第一次安装 App 时,系统会拿到该 App 内的 entilement 文件(由 Xcode 相关设置生成,也可直接在文件内添加配置,Xcode13之后貌似不用了);根据该文件中的键值对还没理解的话,可以顺着这个思路:首先如果使用 Universal Link ,那么就只用使用 domain/path 的路径来完成跳转。另外,又需要一个引导页,所以这个引导页必须发布到后端服务器对应的 path 中,或者使用路由的方式来进入这个引导页;
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. 注意点
apple-app-site-association 中的 path 配置时,最好不要重复设置同一个 AppId 对应的 path,猜测可能是前面的 path 优先级更高,后面的 path 优先级低,会被忽略。(这里指的是同一个 AppId,而不是多个 AppId):
image.png
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 的方式来做验证;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)