universal links
是iOS9之后 苹果推出的一种能够方便的通过https 链接来启动APP的功能。当你的APP支持universal links 的话,点击配置好的连接,可以跳转到你的APP,如果你的APP没有下载 或者不支持的话,那么点击链接会通过Safari 打开。
当我使用1.8.6 版本的微信SDK实现微信分享,支付等功能的时候,后台网站需要配置universal links,对openSDK分享进行合法性校验。这是一个必填项。那么该如何配置通用链接呢?
-
首先登陆开发者中心,在证书列表页面找到你的 APP id
-
点击该id,进入到该id 的配置页面,选择打开 Associated Domains
以上是网站后台的配置,下面进入到APP配置。
-
打开APP项目,按如下图方式打开 Associated Domains
-
在domains 下面 按如下填写,注意 前面一点要以 applinks:+ 你网站域名(此域名下放下文中提到的文件)
- 创建名称为 apple-app-site-association 的文件,内容为json,但是不能有后缀名(如果创建了.json的文件,再手动删除后缀名 ,这样是不对的)
创建方法:
打开终端,cd 到指定文件夹,'touch apple-app-site-association' 回车
打开文件,复制以下内容:
{
"applinks": {
"apps": [],//必须为空数组
"details": [ //你的网站可以支持多个APP跳转
{
//appid 为你应用的唯一标识,由teamid 和 bundleid 组成
"appID": "teamId.bundleId",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "teamId.bundleId",
"paths": [ "*" ]
}
]
}
}
特别说明:
paths:为 限制哪些路径可以跳转到你的APP,如果不限制 可以使用通配符`*`,在微信SDK ,我设置的path 为一个 /StoreHelper/*,所以我的universal links 为 https://mydomain/StoreHelper/,微信自己会在末尾匹配相应的字符串。
注:在iOS9.3以后,此文件在未压缩状态下都不能超过128k!!!
- 将你创建的json 文件上传到服务器(让后台开发人员放到一开始项目中配置的域名的根目录下,或者.well-known目录下,别忘了中间有个 点
.
),这是为了苹果能获取到你上传的文件,上传后先访问一下,https://yourDomain/apple-app-site-association 或者https://yourDomain/.well-known/apple-app-site-association. 其实苹果是先访问后者,再访问前者,如果不想多次访问服务器,可以直接放在.well-known 目录下。
访问该链接,应该是能下载,或者能在网站直接打开该文件,不管什么样的形式都要能看到该文件的内容。如下:
- 代码中的配置,APPdelegate 中实现如下三个方法:
//以下两个方法是为了兼容低版本,适配 Custom URL scheme 自定义url,之前的传统方式
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
//微信sdk 中的方法
return [[HLWXAPIManager manager]hl_handleOpenURL:url];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
//微信sdk 中的方法
return [[HLWXAPIManager manager]hl_handleOpenURL:url];
}
//以下的方法是通过 https 通用链接 打开APP时 会回调的方法,如果链接配置失败,是不会打开如下方法的,会走上面的方法。在此方法中可以进行判断,因为是配置微信,所以就使用了微信sdk 中的方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
return [[HLWxApiManager manager]hl_handleOpenUniversalLink:userActivity];
}
//微信API 调用(HLWXAPIManager)
- (BOOL)hl_handleOpenURL:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:self];
}
- (BOOL)hl_handleOpenUniversalLink:(NSUserActivity *)userActivity {
return [WXApi handleOpenUniversalLink:userActivity delegate:self];
}
- info.plist中 配置
不然会提示failed for URL: "weixinULAPI://"
<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
<string>weixin</string>
<string>weixinULAPI</string>
</array>
- 验证 通用链接配置是否成功。
1、苹果自己提供了个工具:https://search.developer.apple.com/appsearch-validation-tool/
如果出现了以下页面,表示是正确的(验证的时我放的连接是 https://yourDomain而不是整个universal link )。
2、将通用链接 universal link 放到备忘录,长按 能够可以跳转到你的APP
3、如果用于微信sdk ,以下验证的页面只出现一次,而不是每次都出现。
如果是微信登录,不会出现两次授权弹框
Universal Link(通用链接)注意点
-
Universal Link
跨域问题,Universal Link
必须要求跨域,如果不跨域就不会跳转。(iOS9.2之后的改动)。
假如当前的页面的域名是A,当前网页发起跳转的域名是B,必须要求B和A是不同的域名才会触发Universal Link
,如果B和A 是相同域名,只会继续在当前WebView里面进行跳转,哪怕你的Universal Link
一切正常,根本不会打开APP(因为我只是适配了微信的sdk,能够实现分享登录和支付,在网页内跳转并没有做实测,所以这个需要注意)。
Universal Link
请求 apple-app-site-association
时机。
- 当我们的APP在设备上第一次运行时,如果支持Associated Domains功能,那么iOS会去get 定义的Domain下的apple-app-site-association文件。
- iOS 会先请求
https://domain.com/.well-known/apple-app-site-association
,如果此文件请求不到再 去请求https://domain.com/apple-app-site-association
,如果想要避免服务器多次get请求,可以直接把apple-app-site-association放在./well-known目录下。 - 服务器上的
apple-app-site-association
的更新不会让iOS本地的apple-app-site-association
同步更新,即iOS只会在APP第一次启动的时候请求一次,以后除非APP更新或者重新安装,否则不会在每次打开时请求apple-app-site-association
文件。
Universal Link的好处
- 之前的
Custom URL scheme
是自定义的协议,因此在没有安装该APP的情况下是无法直接打开的。而Universal Links
本身就是一个能够指向web页面或者APP内容页的标准的web link,因此能够很好的兼容其他情况。 -
Universal Links
是从服务器上查询哪个APP需要被打开,因此不存在Custom URL scheme
那样名字被抢占冲突的情况。 -
Universal Links
支持从其他APP中的uiwebview中跳转到目标APP。 - 提供
Universal Links
给别的APP进行APP间的交流时,对方并不能够用这个方法去检测你的APP是否被安装(之前的`Custom URL scheme的canOpenUrl 方法可以)。