iOS 之 Universal Links
苹果自iOS9.0推出Universal Links,手机中如果安装了支持该链接的App就会直接进入到App中;如果没有安装APP则会跳转到Safari浏览器中,展示H5页面。 这样可以通过HTTPS链接来无缝启动APP。Universal Links 的执行原理如下:
- 安装app后,iOS系统会检查App Bundle中的 Info.plist 文件;
- 若有Associated Domain字段,会读取applinks:后面的域名;
- 若该域名根目录下有名为apple-app-site-association的文件,然后系统会将其下载到本地并解析;根据path建立与appid的映射关系,保存在系统的数据库中;
- 如果有访问https://域名/path/ 的链接,系统会根据映射关系找到的appid,启动该App,打开App后触发Delegate方法,实现Universal Links。
下面来看看 Universal Links 的配置过程。
1. 开发者账号端配置
1)登录Apple账号点击已创建的AppID,跳转到APP 信息页面;
2)记录下Team ID 和Bundle ID 备用;
3)勾选列表中的”Associated Domains“选项;
2. 业务服务端配置
4)创建一个名为apple-app-site-association(不能修改,且不能添加后缀);
5)文件内添加以下json格式数据;
//// 域名下只有一个path,只对应一个App
{
"applinks": {
"apps": [],
"details": [
{
"appID":"8ARUHGUQNH.com.YHKJ.AppSample",
"paths": [ "/AppSample/*"]
}
]
}
}
//// 域名下的不同path,对应着多个APP
{
"applinks":{
"apps":[],
"details":[
{
"appID":"8ARUHGUQNH.com.YHKJ.AppSample",
"paths":["/AppSample/*"]
}
{
"appID":"8ARUHGUQNH.com.YHKJ.appManage",
"paths":["/manageAppSample/*"]
}
]
}
}
6)apple-app-site-association文件应置于域名服务器根目录下,也可以在根目录中添加.well-known文件夹,将文件上传到.well-known文件夹下(.点一定不能少),对应连接如下;
//// domain 为服务端域名
// https://domain/apple-app-site-association
// https://domain/.well-known/apple-app-site-association
注意:
- 以上内容严格区分大小写;apps:必写且固定为[ ];appID:格式为teamID.bundleID;
- paths:为所支持的path字符串数组,用于过滤可以跳转到App的链接,且支持通配符;
- iOS 会优先请求.well-known路径,若apple-app-site-association文件请求不到,再去请求根目录,因此若要避免服务器接收过多GET请求,可以直接把apple-app-site-association文件放到well-known目录下。
3. iOS 端配置
7)打开Xcode工程配置中的Signing&Capabilities项,添加 Associated Domains 功能;
8)在Associated Domains中添加域名地址项,格式为 applinks:域名地址。
9)由webView跳转进入业务App时接会收到回调,需在AppDelegate.m/SceneDelegate.m 中实现下面回调方法。
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
// NSUserActivityTypeBrowsingWeb 由Universal Links唤醒的APP
if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
return YES;
}
NSURL *jumpUrl = userActivity.webpageURL; // 这个URL就是你跳转的那个URL,下载页地址,想要传参数可以直接在URL后面拼接
// TODO:在这里进行跳转具体页面的操作
return YES;
}
4. 测试Universal Link链接是否有效
Apple提供了一个网页,可以验证业务服务端的apple-app-site-association文件是否有效。
https://search.developer.apple.com/appsearch-validation-tool/
也可以在iOS自带Safari浏览器中,打开 Universal Link 链接,如果 Universal Link 配置成功,下拉会出现应用入口,点击“打开”可以跳转至原生App;如打开微信的 Universal Link:https://help.wechat.com/app/。
5. 注意事项
- 服务端的域名地址必须支持https,并且SSL证书必须通过苹果信任。
- apple-app-site-association文件名不可变且不能加后缀,位置固定。
- apple-app-site-association文件的更新不会使iOS本地的apple-app-site-association同步更新,Universal Link的更新只有在APP第一次安装、更新版本的时候。如果Universal Link有变更,只能重新打包发版让用户更新版本,或卸载重装。
- 跨域问题,如果由当前网页跳转Universal Link打开APP,当前网页的域名和Universal Link 的域名必须 不能一致,否则不会跳转,只会在当前的WebView里面跳转。
6. 与 URL Scheme 的比较
另一种外部唤起App 的方式是URL Scheme,但是URL Scheme有一些弊端:
- Universal Links 具有唯一性,比较安全,它是使用标准的HTTPS协议链接到你的web站点,所以一般不会被其它的APP所声明。而 URL Scheme 是由开发者自定义的,没有限制,任何App都可以用同一个名字,有些钓鱼App可以 设置知名的App 的URL Scheme 来欺骗用户。
- URL Scheme 可以通过 canOpenURL 判断用户是否安装App,但是只有安装了APP才能跳转,未安装则没有效果。而 Universal Links 如果安装了就跳转APP,如果未安装就跳转网页展示你网站的内容,比较灵活。
- 使用scheme跳转系统会弹框提示,替换成UL链接后可以实现无缝跳转。