目录
一.为什么要配置Universal Links
二.Universal Links配置步骤及验证
三.微信QQ的Universal Links配置问题
四.常见问题及解决方案
苹果官方文档:苹果官方文档-Universal Links
一.为什么要配置Universal Links
1.Universal Links可以通过配置指定域名路径直接唤醒APP,一步到位。对比以前的 URL Scheme跳转强大太多,有兴趣可以自行谷歌了解详细原因这里不作太多解释。
2.QQ微信等第三方平台在2021以后相关分享第三方登录都会进行universal link的校验,不配置的话将无法正常使用第三方的功能。
二.Universal Links配置步骤及验证
1.创建一个名字叫做apple-app-site-association,包含固定格式的json文件内容如下:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TeamID.com.demon.lan",
"paths":["*"]
]
}
⚠️ 注意事项:
1.文件名字必须为apple-app-site-association,不能带json后缀名,不能带json后缀名,不能带json后缀名,重要的事情说三次。
2.apple-app-site-association中的appID 的格式为 teamID.BundleID,teamID和BundleID在开发者网站 Identifiers一栏可以找到。(BundleID在xcode里面也可以找到)
譬如说我的teamID是xxxxxxxxxxx,bundleId是com.mytest.app (为了方便叙述,文章后面都将用com.mytest.app 作为示例的bundleID, bundleID反过来app.mytest.com则表示示例域名,大家的项目应该都是这么命名的吧)
3. paths配置,实际上就是限制哪些路径可以唤醒app,哪些路径不能唤醒app。
上面的示例中是"paths":["*"] , 只有一个*则表示整个网站都可以使用,不推荐这么写,博主刚开始是这么配置的,出了一个严重的bug,一个支付H5链接,本来点击去H5支付页面的,结果因为我这么配置了,只要链接包含域名直接往APP里面跳,导致用户无法支付!
所以我们要加一些路径:
比如现在我项目有一个把一个事件记录到系统日历里面的功能,里面放一个指定链接如:https://app.mytest.com/SystemCalendar/ 点击直接进入我的APP,那么我path就需要像下面这样配置就好啦,(备注:为了兼容后面需要加字段,我在后面添加了* 来指定网站的某一部分)
"paths": [ "/SystemCalendar/*"]
依次类推如果还想加其他路径,用逗号分割即可,文章后面也会加入QQ微信等path,以下是苹果官方文档示例可以了解一下,注意配置的paths路径,是区分大小写的
"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/*", "/videos/wwdc/201?/*"]
2.xcode项目的配置:
在项目的Capablities中开启Associated domains,如下图:
一定要按照applinks:域名 的格式填写
3.服务器的配置:
将apple-app-site-association文件上传到服务器这个需要后端开发配合完成,将这个文件放到服务器的根目录下或者放到.well-known目录下。
当时后端同学给我的截图如下,这里我还是使用文章的相关示例id展示:
确保使用https://app.mytest.com/apple-app-site-association这个链接在safari可以打开APP,一定要是这个格式,后缀不能带.json,中间也不能包含其他路径,app.mytest.com为你的服务器域名。
4.验证Universal Links配置是否成功
如果已经配置过Universal Links,那么在用户第一次安装app时,苹果会发送一个请求,请求你服务器上的apple-app-site-association文件。
请求apple-app-site-association文件成功之后,用户就可以使用Universal Links唤醒app了。测试的咱们最好把应用删了重新装,确保苹果会发请求。
以下几种测试方法可以参考:
1.直接将https://app.mytest.com/SystemCalendar 复制到Safari打开,记得下拉以下看看会不会出现APP的跳转栏,像下面这样就是成功了
2.快捷验证,在备忘录中输入https://app.mytest.com/apple-app-site-association,长按这个链接,如果能正常显示出apple-app-site-association文件内容,则表示服务端已经上传成功了。
然后长按 https://app.mytest.com/SystemCalendar ,出现“在xxxx中打开”(xxxx为你的项目名称)则表示配置成功
3.使用苹果的验证网站,验证文件是否能被苹果请求到。如果是未上线的应用,使用验证网站时可能出现如下提示:
出现该提示为apple-app-site-association文件配置正确。
出现404错误码提示,则为apple-app-site-association文件未上传成功,或者使用https://yourdomain.com/apple-app-site-association路径无法访问,需要检查网络和后端同学联调一下。
Tips:服务器必须要支持https,而且需要支持TLS1.2协议以上,不过相信苹果强制支持https之后,这个坑就会慢慢填上了。现在还有很多童鞋的服务器使用的免费的证书,或者证书不被苹果信任,然后就会导致无法下载apple-app-site-association。苹果支持的https根证书列表
apple-app-site-association文件名千万不能写错,使用charles抓包显示,只有初次安装app时才会去请求apple-app-site-association文件,所以测试时有可能因为网络波动导致apple-app-site-association文件获取失败。这种情况,多卸载几次,安装时使用4G。
验证各种配置的还有一个网站,需要打成ipa包丢上去。
5.通过Universal Links跳到APP内,获取URL:
OC代码:
-(BOOL)application:(UIApplication*)application continueUserActivity:(NSUserActivity*)userActivity restorationHandler:(void(^)(NSArray*_Nullable))restorationHandler{
NSLog(@"userActivity : %@",userActivity.webpageURL.description);
returnYES;
}
Swift代码:
func application(_application:UIApplication, continue userActivity:NSUserActivity, restorationHandler:@escaping([UIUserActivityRestoring]?) ->Void) ->Bool{
NSLog("userActivity :\(userActivity.webpageURL.description)")
return true
}
在appdelegate中实现上面这个方法,当使用Universal Links唤醒app时就执行这个方法。
三.微信QQ的Universal Links配置问题
1.QQ的配置
1.登录QQ互联官网,到应用管理->找到应用(需要审核通过) ->查看
按照提示填写相关信息,最后生成如下Universal Links :https://app.mytest.com/qq_conn/12345678,刚创建完是要点击验证的,我们拿到QQ的appId 及12345678(注意这个不是项目的APPID,是QQ生成的);
项目中对接QQSDK需要配置一下这个Universal Links,初始化会让你传进去
然后将 qq_conn/12345678 这个path加入到apple-app-site-association文件,如下
"paths": [ "/SystemCalendar/*", "/qq_conn/12345678/*"]
即 SystemCalendar为上面提到过的日历路径 ,/qq_conn/12345678/*则QQ的路径,
相关QQ配置可参考QQUniversallinks配置
3.微信的配置
和上面QQ类似,个人感觉比QQ简单很多,登录后台配置一条Universal Links,如果有指定路径则和上面一样加上指定路径,也可以直接填域名,项目内初始化传入即可。
四.常见问题及解决方案
1:appid和项目中为什么要配置支持associate domains呢?
为了在app启动的时候告诉系统,我这个app支持Universal Links呀,这样系统才方便根据项目中配置的domain域,去下载apple-app-site-association文件呀。
2:apple-app-site-association文件配置了一堆是干啥用的呀?
作为WebKit加载链接时进行拦截,然后跳转到目标app的配置文件呀。
3.按照上面写的配好了,怎么死活打不开呀???
a.必须支持https,一定要是符合苹果认证的https证书;
b.配置文件问题,apple-app-site-association文件中配置的path和测试用的通用链接不一致,注意是区分大小写的;
c.域名问题,xcode中配置的域名一不小心写错了。
6.为毛有的手机成功了,有的手机就不行呢???
上面也提到过,因为网络波动有可能会导致部分用户第一次安装时,无法下载apple-app-site-association文件,这个只能引导用户删除重装或者在迭代时修改Associated Domains配置告诉系统重新下载apple-app-site-association文件。
7.服务器换域名了肿么办???
博主做了一个小测试,当Associated Domains添加新的 Domains的之后,在app再次启动的时候抓包发现(不需要删除重装),苹果会给新添加的这个Domains发送一个请求,请求新Domain下的apple-app-site-association文件。也就是说Associated Domains发生改变的话,系统是会知道的,这样就可以在迭代的时候删除旧的域名,添加新的域名了。另外Domains的配置也可以使用通配符,例如:applinks:*.mywebsite.com
8.备忘录和safari中都可以打开app,怎么分享到其他app里面就不行了?
未跨域导致的,如:分享到微信的链接是 https://www.mydomain.com/share.html,然后该网页中的“在app内打开”按钮配置的通用链接为 https://www.mydomain.com/index.html。跨域的意思是说,通用链接 和 调用通用链接的网页不要使用同一域名。即如果通用链接域名为“www.mydomain.com”,则通用链接所处的网页域名就不能是“www.mydomain.com”。
总结不易,如有帮助到你,点个赞再走呗~