Universal Link(通用链接)是苹果在iOS9
推出的,一种能够方便的通过传统HTTPS链接来启动APP的功能,可以使用相同的网址打开网址和APP。
看起来就是一条普通的https
链接,当然是我们在该链接域名根目录配置过的一个链接,也可以在该链接中放置对应的H5页面。当用户的点击该链接,只要手机中安装了支持该链接的APP就会直接进入到APP中。如果没有安装APP则会跳转到Safari
浏览器中,展示H5页面。对用户来说则是一个无缝跳转的过程。
- 在苹果开发者账号打开Associated Domains配置
- 在xcode打开Associated Domains开关,将Universal Links域名加到配置上
如果没有Associated Domains选项,点击上方的+Capability添加。
- 配置URL Types
把微信的appID添加为url scheme
- 配置LSApplicationQueriesSchemes
打开plist的LSApplicationQueriesSchemes,添加微信的scheme
<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
<string>weixin</string>
<string>weixinULAPI</string>
</array>
- 配置apple-app-site-association文件
创建一个空白文件(必须纯文本,命名为apple-app-site-association
,去除后缀名)
{
"applinks": {
"apps": [],
"details": [
{
"appID": "teamID.bundleID",
"paths": [ "*" ]
}
]
}
}
- 后台服务器配置
把文件apple-app-site-association,放置在服务器的根目录或者.well-known的子目录下,然后让服务端提供一个https的url地址,格式是“正式域名/apple-app-site-association”,如:https://www.demo.com/apple-app-site-association。
用浏览器打开这个地址,可以下载这个文件。用GET请求这个地址,返回文件的JSON内容。
- 微信开放平台配置
配置好bundleID和universalLink
如果后台提供的url地址是 https://www.demo.com/apple-app-site-association。那么 Associated Domains 中填写applinks:www.demo.com
微信后台的Universal Links填写https://www.demo.com/
- iOS初始化微信的代码
[WXApi registerApp:APP_ID universalLink: UNIVERSAL_LINK];
重写AppDelegate中的事件
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:self];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [WXApi handleOpenURL:url delegate:self];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
return [WXApi handleOpenURL:url delegate:self];
}
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
return [WXApi handleOpenUniversalLink:userActivity delegate:self];
}
如果无法调起微信分享和登录,可以打开日志查看Universal Links的校验情况
[WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
NSLog(@"checkUniversalLinkReady:%@, %u, %@, %@", @(step), result.success, result.errorInfo, result.suggestion);
}];
[WXApi startLogByLevel:WXLogLevelNormal logBlock:^(NSString * _Nonnull log) {
NSLog(@"WXApi-->%@", log);
}];
checkUniversalLinkReady如果走到第五步成功,则表示Universal Links配置正确。
checkUniversalLinkReady:5, 1, Universal Link check passed. The application is launched by WeChat via Universal Link,
checkUniversalLinkReady:6, 1, All Check Passed!,
WXULCheckStep值说明:
- step =
WXULCheckStepParams
: 参数检查 - step =
WXULCheckStepSystemVersion
: 当前系统版本检查 - step =
WXULCheckStepWechatVersion
: 微信客户端版本检查 - step =
WXULCheckStepSDKInnerOperation
: 微信SDK内部操作检查 - step =
WXULCheckStepLaunchWechat
: App拉起微信检查 - step =
WXULCheckStepBackToCurrentApp
: 由微信返回当前App检查 - step =
WXULCheckStepFinal
: 最终检查
上线时需要把checkUniversalLinkReady注释掉,否则每次初始化微信SDK时都会跳转微信正在连接页面。
如果提示“checkUniversalLinkReady:5, 0, Universal Link check failed. The application is launched by WeChat via scheme, Common problems self-check guide...”,是因为Universal Link校验不通过。
排查以下原因:
- 工程配置associated domain未打开或未添加Universal links域名
- 配置文件未上线或未按苹果要求放在服务器指定的路径下(域名根目录)
- 配置文件的Universal links的path末尾没有加通配符*
- 配置文件的appID(teamID+bundleID)与实际代码和微信开放平台配置的bundleID不匹配
注意:不能连续调用微信分享接口,否则会提示“由于应用安全校验不通过,无法完成微信分享”,混淆了错误,很坑。