iOS的通用链接(UniversalLink)汇总 + Sche
一、概述
1.1、技术描述
官方的描述如下:
Seamlessly link to content inside your app, or on your website in iOS 9 or later. With universal links, you can always give users the most integrated mobile experience, even when your app isn’t installed on their device.
iOS9.0后开始支持,使用“通用链接”技术的App,支持点击外部的url链接,如果App有安装,则直接打开App且可以直接到具体页面;如果App未安装,则会在Safari打开,并且提示按钮,点击可以跳转AppStore下载地址页。
总的来说,其和Scheme技术相近,都是允许外部唤起App的技术方案,都是DeepLink
的实现方式之一。
1.2、使用场景:
- 拉新:通过活动链接分享到社交平台,新用户点击可以跳转到App的下载介绍页,点击下载可以直接到AppStore的下载页进行下载。
- 活动溯源回流分析:活动链接分享到社交平台后,用户点击跳转回App的具体页面,这样可以更准确分析活动效果,看有多少用户点击跳回。
- 广告精准投放:点击广告,可以直接拉起目标App,提高广告的转化率。
1.3、对比UniversalLink ,Scheme存在的缺点
Scheme是以appShcema://url_path
打开app的方式,必须在xcode的URL Types
配置声明,支持的Scheme前缀。
- Scheme无法判断是否安装App。如果已经安装则跳转成功,未安装打开失败没有效果。
- 任何App都可以用同一个名字,有些钓鱼App如果暂用被安装了,可能被欺骗。
可以说UniversalLink解决Scheme上面两个弊端,提供更加流畅和安全的用户体验。
二、UniversalLink大概配置(具体自行Search,网上教程很多)
-
环境要求:
后端服务器必须https,且拥有该域名下的上传到根目录的权限;
只支持iOS9+的系统,旧系统只能走Schema。 -
开发者中心配置:针对具体的AppId进行配置,在在Application Services里开启Associated Domains。
-
XCode工程配置:在Associated Domains下配置
applinks:xxx域名xxx
,必须以applinks:
开头。 -
编写
apple-app-site-association
配置文件,并且上传到后端服务器根目录下,文件格式如下。
{
"applinks": {
"apps": [],
"details": [
{
"appID": "开发者后台的应用id",
"paths": [ "/openapp/*"]
},
{
"appID": "开发者后台的应用id",
"paths": [ ""]
}
]
}
}
- 代码处理UniversalLink,在以下方法中拦截处理url
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler
- 校验UniversalLink是否配置成功,有以下两种方法
- “备忘录”应用中,输入UniversalLinks,点击弹窗“跳转到某app”,则说明成功。
- 在Safari中打开,在出现的网页上方下滑,可以看到有在”XX”应用中打开。
三、UniversalLink的原理
-
1、当App初次安装后或者更新版本后的
第一次启动(第二次启动就不会)
,向工程配置的applinks:
的域名请求apple-app-site-association
配置文件。 -
2、App自动的将
apple-app-site-association
配置文件向iOS系统配置。 -
3、当任何WebView发起UniversalLink的url的时候,系统遍历注册过的通用链接,如果命中则直接打开App触发Delegate方法。
-
4、如果没命中,WebView继续跳转加载url。
以上都是系统默默替你做的,我们要做的就是确保配置的正确性。
四、常见问题
-
4.1、UniversalLink的跨域要求:使用UniversalLink网页的域名必须和UniversalLink的域名不同。
a、如果外部的网页的域名A,在当前网页点击发起UniversalLink的跳转,这个UniversalLink的域名B。
b、则必须要求 B 和 A 是不同域名,才会触发Universal Link。
c、如果B 和 A 是相同域名,只会继续在当前WebView里面进行跳转,即使你的Universal Link一切正常,根本不会打开App。 -
4.2、不同App配置相同一个UniversalLink域名
假设有App1、App2两个不同的应用,都需要配置UniversalLink,这个UniversalLink的域名可以相同,可以通过配置文件里面的path
进行区分。 -
4.3、UniversalLink的更新时机问题
apple-app-association
只有在以下两种情况下才会更新:
a、App安装后的第一次Launch。
b、App版本更新后的第一次Launch。因此,如果确实需要部署好几个版本后修改
apple-app-association
的配置信息,想要挽回又让那部分用户无感,则App必须重新打包发版。 -
4.4、由于
apple-app-association
配置文件下载失败问题
在开发过程中,遇到过测试手机昨天可以,今天就不行了,代码没有改过。这有可能测试手机连接抓包,代理等,导致安装app后第一次启动,apple-app-association
配置文件捞取不到,导致无法跳转。
这种情况下,重启手机,并且重新安装包。
五、URL Schemes 使用概述
下面简单说说Schemes的配置方法;
5.1、使用URL Scheme
跳转到其他应用
-
第一步、设置白名单
app的info.plist
文件中增加LSApplicationQueriesSchemes
字段类型为Array,然后把第三方应用的Schemes加入。例如微信weixin://
等等 -
第二步、使用
openUrl
直接跳转第三方,调用之前确认下是否可以跳转。
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString: customURL]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
} else {
....
}
5.2、自定义URL Scheme,其他应用跳转到我们的app
-
第一步、声明自定义的Schemes
在App内的info
->URL Ttpes
->新增自定义URL Schemes
。 -
第二步、在ApplicationDelegate实现回调函数中
主要是区分不同的Schemes,判断不同的回调来源,做不同的业务逻辑处理。
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
-
第三步:测试
在Safari或者H5网页中直接使用自定义的schemes打开,就可以唤起我们app。 -
自定义Schemes的命名规则(没有强制规定,业内通用的做法如下)
一般普通字符串,可以包括点符号。例如com.xxx.pay://
或者wxpay://
等。
也可以像微信那样,使用路径区分业务。例如appKey://platform:wechat
、appKey://platform:oauth
六、其他、
-
市面有些第三方平台提供的Link接入方案,其实也是利用利用UniversalLink和Scheme实现的,例如:UMeng的ULink功能,友盟更多做好统计分析等业务场景。
-
微信对于Schemes和UniversalLink的使用
使用微信分享的sdk,返回App的时候发现,微信有时候使用Schemes而有时候使用UniversalLink。
微信的判断策略是什么?检测是否支持Schemes或者UniversalLink?或者是有策略使用某一种?
这个不得而知,有知道的朋友帮忙解答下,万分感谢。