Universal Link 是 iOS9 推出的一项功能,使你的应用(微信,微博等)可以通过传统的HTTPS链接来启动APP,而不是使用 scheme 的方式
在苹果开发者中心配置 Associated Domains
- Certificates, Identifiers Profiles
- Identifiers
- 勾选 Associated Domains
在 xcode 中启用 Associated Domains
- TARGETS
- Signing & Capabilities
- "+" 添加 Associated Domains
格式为
applinks: + 域名
- 域名需要为 Https
- 域名最好不要与 app 接口域名一样,这与微信分享有关
- apple-app-site-association 文件会存放在此域名的根目录下
配置 apple-app-site-association 文件
创建一个内容为 json 格式的文件,当我们的App在设备上第一次运行时,如果支持Associated Domains功能,那么iOS会自动去获取上述在xcode 填写的域名下的apple-app-site-association文件。
文件内容大概是这样子:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "ABCD1234.com.company.myApp",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
//多个app
{
"appID": "ABCD4321.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
注意点:
- apps:是限制只能在这几个app中使用, 基本是不填写,所以是空数组
- appID:TeamID.Bundle ID(TeamID 可以从开发者中心 -> Membership 中获取)
- paths:设定你的app支持的路径列表,只有这些指定的路径的链接,才能被app所处理。星号代表了可识别域名下所有链接
- 文件名必须为 apple-app-site-association,且文件无后缀
最后,把该文件上传到在 xcode 中填写的域名的根目录或者 .well-known 目录下,上传后,自己在浏览器访问下该文件目录,如果上传成功,会直接下载该文件。
跳转回 APP 的处理
在 AppDelegate 里实现方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray> * _Nullable))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSString *urlStr = userActivity.webpageURL.absoluteString;
if (期望的 url) {
}
else {
}
}
return YES;
}
测试
在手机备忘录中输入App能识别的链接,然后直接点击此链接,就会直接跳转到你的app了。或是长按,在出现的弹出菜单中第二项是在’XXX’中打开,这也代表着成功。
能识别的链接可以填写上述在xcode中填写的域名地址,也可以在此域名后面添加别的参数
到这里,基础的 Univarsal Link 的接入已经完成了。
shareSDK 1.8.6 与 Univarsal Link
shareSDK 更新到1.8.6后,微信的API发生了少许变更,其中注册的API需要传一个Universal Link,如果不进行配置,微信无法进行分享,出现以下错误:
-canOpenURL: failed for URL: "weixinULAPI://" - error: "This app is not allowed to query for scheme weixinulapi"
我们要进行以下的一些配置:
xcode 配置
- TARGETS
- Info
- LSApplicationQueriesSchemes 添加一个元素 weixinULAPI
微信开放平台配置
在微信开放平台的应用详情中配置 UniVersal Link
格式要求为 https 开头,以“/”结尾,中间就是在 xcode 填写的域名
https://域名/
代码编写
shareSDK 更新到1.8.6后,微信的 API 增加了 Universal Link 的参数,我们传入在微信开放平台上填写的 Universal Link (例:https://www.myApp.com/)就好。
/*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。
*
* 需要在每次启动第三方应用程序时调用。
* @attention 请保证在主线程中调用此函数
* @param appid 微信开发者ID
* @param universalLink 微信开发者Universal Link
* @return 成功返回YES,失败返回NO。
*/
+ (BOOL)registerApp:(NSString *)appid universalLink:(NSString *)universalLink
/**
设置微信(微信好友,微信朋友圈、微信收藏)应用信息
@param appId 应用标识
@param appSecret 应用密钥
@param universalLink 应用深度连接
*/
- (void)setupWeChatWithAppId:(NSString *)appId appSecret:(NSString *)appSecret universalLink:(NSString *)universalLink;
其他问题
有的手机成功了,有的手机就不行呢?
- 因为网络波动有可能会导致部分用户第一次安装时,无法下载apple-app-site-association文件,这个只能引导用户删除重装或者在迭代时修改Associated Domains配置告诉系统重新下载apple-app-site-association文件
- 另外一种可能是苹果服务器抽风导致
服务器换域名了怎么办?
当Associated Domains添加新的 Domains的之后,在app再次启动的时候抓包发现(不需要删除重装),苹果会给新添加的这个Domains发送一个请求,请求新Domain下的apple-app-site-association文件。
也就是说Associated Domains发生改变的话,系统是会知道的,这样就可以在迭代的时候删除旧的域名,添加新的域名了。
另外Domains的配置也可以使用通配符,例如
applinks:*.mywebsite.com
移动端配置好,web端如何配置?
一般从APP内分享出去的网页,可以被苹果用户和安卓用户同时查看,在这里需要由web端使用js判断当前所处的平台以及其系统。
如果是安卓用户,则显示安卓相关提示页面。
如果是苹果用户,那么分两种:
如果是9.0以上的系统,相关的 『在APP内打开』 按钮的链接配置的就是我们的Universal Link(通用链接)了,且该通用链接地址指向的是一个APP下载引导页面,那么当用户安装了APP,即可通过通用链接唤醒APP;如果用户没有安装app,那么就会跳转到通用链接指向的APP下载引导页面,达到最大化的客户导流。
如果是9.0以下的系统,则相应的『在APP内打开』 的按钮就会发一个跳转到我们APP URL Scheme的重定向,以实现在Safari中唤醒我们的APP。
当使用通用链接唤醒APP之后,手机右上角有一个小按钮,那个小按钮只有在iOS10.0以下才有,是可以引导用户跳转到Safari中,名字叫bread crumbs button(面包屑),当然也去不掉,并且当用户点过这个按钮后,再点击Universal Link(通用链接)不会直接打开对应的APP。
备忘录和safari中都可以打开app,怎么分享到其他app里面就不行了?
未跨域导致的,如:分享到微信的链接是https://www.mydomain.com/share.html,然后该网页中的『在APP内打开』 按钮配置的通用链接为https://www.mydomain.com/index.html,域名都是同一个。
跨域的意思是说,通用链接和调用通用链接的网页不要使用同一域名。即如果通用链接域名为www.mydomain.com,则调用通用链接所处的网页域名就不能是www.mydomain.com。
参考文章:
官方文档
iOS 唤起APP之Universal Link(通用链接)
shareSDK与微信配置