iOS:Universal Link

iOS:Universal Link,第1张

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/ 对应位置:

服务器中的.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/test1https://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;

还没理解的话,可以顺着这个思路:首先如果使用 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-association 中 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 的方式来做验证;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/990266.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存