上下文
演进过程
iOS9之前,一直使用的是Schema URL技术来从外部对App进行跳转,但是,iOS系统中进行Schema URL跳转的时候如果没有安装App,会提示"Cannot open Page"的提示,非常不友好。
为了解决这个问题,研究出了比较成熟的方案来试探是否已经安装了这个App,那就是通过在H5页面中嵌入一个看不到的iframe,在iframe中进行schema的URL跳转,通过定时器检查是否已经跳转到了App来带来相对良好的体验。
从iOS9开始,苹果将这一路径封杀了,iframe无法再进行Schema URL的跳转;但关上一扇门也打开了一扇窗,从iOS9起可以使用Universal Links技术进行跳转页面,这是一种体验更加完美的解决方案。
可以使M站与App在iOS进行无缝结合,Universal Links的地址采用的是https://domain
这样的普通网页地址的形式,在非自然流量访问m站的情况下,点击了Universal Links,如果安装了App,那么会自动跳转到App继续上一步操作,如果没有安装默认情况下则会请求这个URL地址继续在M站上进行操作。
当然通常的操作就是会引导去强制安装App,然后在安装完成的App上进行继续的操作,这也许与苹果当初的初衷又背道而驰了。
运作原理
App在安装完成的那一刻,iOS系统如果感知到这个App打开了Associated Domain能力,且添加了符合Universal Links的配置,就会从配置的域名下顺序分别请求:
https://domain/.well-known/apple-app-site-association
https://domain/apple-app-site-association
从文件中关联App,做好关联配置。
当系统中遇到触发Universal Links操作的时候就会根据关联配置对App进行打开,并且将完整地址传入AppDelegate中专门处理Universal Links的delegate方法中。
开发者便可以在这个delegate方法里进行相关处理,延续之前的操作。
实践
准备条件
- 一个加入开发者计划的账号
因为苹果Universal Links技术需要用到Associated Domain的Capability,而能够在XCode的Capabilities页面中能够看到并且开启这个能力的只有加入开发者计划的账号才能打开。
- 一个可以通过https请求的域名 二级三级都行
这个比较好解决,目前github的pages服务的二级域名就可以开启https,而且iOS9.3.1系统版本开始放宽了对文件格式必须是text/json的强制规定,普通的文本格式即可。
需要可以通过https://domain/apple-app-site-association
访问到关联配置文件,否则Universal Links无法成立,目前这一条件比较宽松
这两个条件其中一个不满足就无法成立,果爸果然是霸道!👍
第一步:开启Associated Domain能力
使用加入苹果开发者计划的账号登录Xcode。
项目设置中选中开发者计划的账号,让Xcode帮助你完成各种一系列创建Profile及相关配置等。
到Capabilities选项卡,开启 Associated Domain
能力,并添加一个项目 applinks:domain
第二步:在domain下添加ios-app-site-association文件关联app
让网站的https://domain/apple-app-site-association
返回以下内容
{
"applinks": {
"apps": [],
"details": [
{
"appID": "ABCDGroupID.com.liuxiaoming.demo.UniversalLinkDemo",
"paths": [ "/scss/*", "/test2/*"]
}
]
}
}
其中appID需要自己拼接 格式为
[GroupID].[BoundleID]
paths中添加匹配的path数组,支持正则表达式。
最终以确保 https://domain/apple-app-site-association
可以访问到正确的内容
第三步 验证效果
编译安装到真机或者模拟器,是否自动启动无所谓,给自己发一条短信,内容是命中的网址,如例子中 https://domain/css/abc.css
就会命中Universal Links操作。
点击自己发送的短信链接,系统就会自动跳转到App中了。
注意点
自然流量
对于自然流量在domain网站中访问到触发Universal Links的情况,iOS并不会自动带入到App中,只会在页面顶部展示一个进入app的小条,而且需要用户加载完网页后下拉才能看到。
用户习惯变更
如果用户在跳转如app后,点击了右上角返回网页,那么下次就会继续跳网页而不会跳app了,这个程序无法控制,需要用户自己在链接上长按,将其模式切换成跳转app才行。
iOS的bug
我自己尝试了一些,推测iOS9 <= version < 10.2
存在一个bug就是apple-app-site-association
文件更新不及时,需要重启并且删除重新安装才能生效。version >= 10.2
不存在这个问题,触发过Universal Links后就会更新到最新内容。
看了下至少维护的App下10.2之前的版本已经是10%左右了,情况还是比较乐观,而且更新这个文件的频率较少,也比较难触发。
高级用法
因为Universal Links,所有操作无论在m站还是app中来回跳转都是可以延续上一步的操作,因为所有参数都是可以在两端中拿到,而如果将Universal Links引导到新装机则情况就不一样了App Store将上一步的数据隔断了,所以业界也会使用归因等技术让其连续起来,目前广泛知晓的Google的Firebase中动态链接技术。