Universal Links(后文统称:UL链接)是苹果自iOS9.0推出的用于应用之间跳转的一种安全认证机制,支持通过传统HTTPS链接来启动APP
相比的URL Scheme最大区别:
- scheme是由开发者自定义的,有一定概率会重复;
- 如果需要使用URL Scheme,则必须提前将scheme加入到Xcode工程info.plist文件的LSApplicationQueriesSchemes白名单中,否则会被系统自动屏蔽;
- 安装应用的同时下载UL链接并导入系统,由于需要配合HTTPS使用因此安全性较强;
- UL链接通常需要跳转的应用双方来共同制定path,不像URL Scheme是由app开发人员单方面自定义;
- 使用scheme跳转系统会弹框提示,替换成UL链接后可以实现无缝跳转;
前提条件:
- 硬件设备搭载的iOS系统版本 >= 10.3;
- 链接必须使用域名,不得是IP地址;
- 域名对应服务器必须使用https,且SSL证书必须通过苹果信任;
公司用就是WoSign CA颁发的证书也就是沃通被苹果屏蔽的,导致我和运维小伙伴研究了很久才找到原因,苹果爸爸再一次教我做了人:我不要你觉得,我要我觉得
iOS信任的证书查询:https://support.apple.com/en-au/HT204132
第一步:配置App
- 在苹果开发者官网,找到你需要配置的App并打开;
- 找到App ID Prefix和Bundle ID,记录以备后用;
- 找到”Associated Domains“选项,打开勾选;
注意:如果当前未勾选,选择打开的同时会导致所有与当前App相关的描述文件全部失效,需要重新配置并保存;
第二步:配置服务器
这里需要运维童鞋支持一下,在host域名对应的服务器.well-known目录下面新建一个json文件,命名为apple-app-site-association,不需要.json后缀
测试办法:例如你的{host}是www.hongyantu.com
,那浏览器打开https://www.hongyantu.com/.well-known/apple-app-site-association
可以下载该文件即可
apple-app-site-association文件的JSON内容:
{
"applinks": {
"apps": [],
"details": [
{
"appID":"MC1A2B3C4D5.com.hongyantu.AppSample",
"paths": [ "/app/*"]
}
]
}
}
appID
:固定值,使用第一步获取到的App ID Prefix和Bundle ID,格式照<App ID Prefix>.<Bundle ID>
paths
:非固定且可以有多个,根据自身要求定义,但需要注意配置通用符号*
,不要带query参数。
第三步:配置Xcode Project
打开你的iOS工程,在project → Signing & Capabilities → + Capability,添加“Associated Domains”
在Associated Domains点击"+
"添加两个参数:applinks:{host}
和webcredentials:{host}
,后面带上,{host}
修改为apple-app-site-association文件配置所在的域名
第四步:测试UL链接
打开https://{host}/apple-app-site-association
,检查是否包含应用Bundle ID,并且取得其paths,并生成UL链接
可以参考微信的apple-app-site-association:
生成UL链接:
当前本人已知的测试UL是否配置成功的方法有三种:
- 使用iOS自带Safari浏览器,打开UL链接,下拉会出现应用入口,点击“打开”可以跳转至原生App;
-
使用iOS自带备忘录应用,输入UL链接并保存,长按会出现”在应用内打开“,点击可以跳转至原生App;
- 使用另一个Xcode工程,调用
openURL:
尝试打开UL链接,可以跳转至原生App。
NSURL *url = [NSURL URLWithString:@"https://help.wechat.com/app/"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
if(@available(iOS 10.0, *)){
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
if(success){
NSLog(@"The URL was delivered successfully.");
}else{
NSLog(@"The URL failed to open.")
}
}];
}else{
[[UIApplication sharedApplication] openURL:url];
}
}
若未跳转至对应App应用,而是打开了网页则表示配置有问题
补充知识
Q:UL链接是在app首次打开的时候,由系统向服务器发起请求获得的吗?
A:准确来说,iOS系统是在安装app应用的过程中向服务器发起请求,如果获得数据则会导入系统
注意:
- 系统会优先请求:
https://{host}/.well-known/apple-app-site-association
- 如果第1步没请求成功,才会请求:
https://{host}/apple-app-site-association
- 修改服务端apple-app-site-association文件内容后,已安装本地应用不会同步更新
- 若需要更新,建议删除当前应用后重新安装
Q:当由浏览器或其他app应用跳转进入我自己的应用时,如何接收回调?
A:需要在AppDelegate.m/SceneDelegate.m中实现下面回调方法:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
if([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]){
NSLog(@"%@", userActivity.webpageURL);//打印URL
}
return YES;
}
Q:如果当前使用浏览器打开,如何获取浏览器URL内容中的query参数?
A:还记得上面第二步骤中paths需要配置通用符号么?这使得开发者可以自定义query参数
例如我们上面测试的链接是:
然而这个链接本身不带有任何query参数,可以在后面尝试加上一些,例如:
在App内可以将后面的query字段解析并转换为字典:
{
@"brand":@"hermes",
@"year":@"2021"
}
Q:如果维护了多个app应用,如何做区分?
A:配置不同的path
个人理解:UL的底层工作原理是通过path
来映射appID
,也就是说当发起跳转时系统会通过寻找path
并匹配appID
最后来决定到底应该唤醒哪个应用,所以针对不同App应当尽量配置不同的path
针对类似问题其实有个比较经典的使用场景:一个开发者同时维护多个应用,并且这些应用都用到了微信和腾讯开放平台openSDK
需要修改apple-app-site-association文件成如下格式:
{
"applinks": {
"apps": [],
"details": [
{
"appID":"MC1AB2C3D4.com.geniune.app1",
"paths":["/wx_conn/100001/*", "/qq_conn/100002/*"]
},
{
"appIDs":["MC1AB2C3D4.com.geniune.app2" ,"MC1AB2C3D4.com.geniune.app2Sample"],
"paths":["/wx_conn/200001/*", "/qq_conn/200002/*"]
}
]
}
"webcredentials":{
"apps":["MC1AB2C3D4.com.geniune.app1", "MC1AB2C3D4.com.geniune.app2"]
}
}
假设我使用的{host}
域名为:www.hongyantu.com
,在域名后面加上任意path即可形成UL链接
因此也得出以下四个结果:
APP1(com.geniune.app1)的UL链接:
https://www.hongyantu.com/wx_conn/100001/ (提供微信开放平台使用)
https://www.hongyantu.com/qq_conn/100002/(提供腾讯开放平台使用)
APP2(com.geniune.app2)的UL链接:
https://www.hongyantu.com/wx_conn/200001/(提供微信开放平台使用)
https://www.hongyantu.com/qq_conn/200002/(提供腾讯开放平台使用)
相关文章:
微信openSDK使用Universal Links
腾讯openSDK使用Universal Links
参考文章:
iOS信任的证书链接
applinks
Associated Domains
使用Universal Links实现App之间跳转
如果本文对你有所帮助记得点个赞哈:)