最近项目中,微信SDK针对 iOS 13系统版本安全性,进行了对应升级,微信SDK版本为openSDK(1.8.6+)。在微信官方介绍中,1.8.6.1 版本开始支持Universal Links方式跳转,对openSDK分享进行合法性校验。
*环境
SDK版本: SDK1.8.6或以上
微信版本: 7.0.7或以上
系统版本: iOS12或以上
一、微信开放平台配置Universal Links
1.配置应用的Universal Links
1)根据 苹果文档 配置你应用的Universal Links
微信对Universal Links配置要求
a)Universal Links必须支持https
b)Universal Links配置的paths不能带query参数
c)微信使用Universal Links拉起第三方App时,会在Universal Links末尾拼接路径和参数,因此App配置的paths必须加上通配符/*
1.2 确认App的Universal Links配置成功
微信使用第三方App的Universal Links唤起第三方App时,会在Universal Links末尾拼接路径和参数,因此开发者Universal Links配置必须加上通配符“*”,并测试Universal Links拼接字符串能否唤起app
例如:我微信开发平台配置Universal Links为:https://www.abctest.cn/
二、配置apple-app-site-association
appID格式为:TeamID + . + BundleID
TeamID在开发者平台找
2.1注意事项:
自己创建一个名叫 apple-app-site-association的json格式文件,注意文件命不需要添加的后缀。apple官方参照地址
注意 用于在paths 数组中指定网站路径的字符串 区分大小写。仅将URL的路径部分用于比较。其他组件(例如查询字符串或片段标识符)将被忽略。
2.2上传apple-app-site-association到服务器(服务器需要支持https)
上传
apple-app-site-association
文件到域名的根目录或者.well-known子目录下
能打开https://www.abctest.cn/apple-app-site-association
或https://www.abctest.cn/.well-known/apple-app-site-association
当我们的App在设备上第一次运行时,如果支持Associated Domains功能,那么iOS会自动去获取域名下的apple-app-site-association文件
- 上传成功后,我们可以用苹果提供的验证网址来直接验证
apple-app-site-association
设置是否生效。
三、开发者平台证书及Xcode工程配置
3.1 登录苹果开发者后台,在设置证书的页面找到 Identifiers -> App ID(设置包名)里,在对应的BundleId下勾选 Associated Domains如下图
保存设置,然后重新生成配置文件。
3.2 Xcode工程配置
·在 Xcode 中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏下的“URL type“添加“URL scheme”为你所注册的应用程序 id:在“LSApplicationQueriesSchemes“添加weixin 和weixinULAPI(如下图所示)
·打开Associated Domains开关,将Universal Links域名加到配置上
注意点:在 Associated Domains里面配置的Universal Links必须要以applinks:开头,后面写上域名。
例如:applinks:www.abctest.cn
四、具体实现(以iOS项目Swift语言为例)
1、在AppDelegate.swift文件的didFinishLaunchingWithOptions方法里注册WXApi:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) >-> Bool {
WXApi.registerApp(kWeixinAppKey, universalLink: kUniversalLink)
return true
}
2、重写 AppDelegate 的 handleOpenURL 和 openURL 方法:
// iOS9.0以前使用
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
let handleUrlStr = url.absoluteString
if let handleUrl = URL(string: handleUrlStr) {
return WXApi.handleOpen(handleUrl, delegate: WXApiManager.sharedInstance)
}
return false
}
// iOS9.0及以后推荐使用
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let handleUrlStr = url.absoluteString
if let handleUrl = URL(string: handleUrlStr) {
return WXApi.handleOpen(handleUrl, delegate: WXApiManager.sharedInstance)
}
return false
}
// 必须实现
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
let handleUrlStr = url.absoluteString
if let handleUrl = URL(string: handleUrlStr) {
return WXApi.handleOpen(handleUrl, delegate: WXApiManager.sharedInstance)
}
return false
}
3、重写AppDelegate的continueUserActivity方法:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
return WXApi.handleOpenUniversalLink(userActivity, delegate: WXApiManager.sharedInstance)
}
四、注意事项
1:必须在IOS9及以上。
2:当在浏览器中点击Universal Links时,如果这个link和页面是同一个域名,则不走调起,而是当做普通链接在当前浏览器打开。
3:在测试阶段,微信分享或者支付不要打开代理抓包,这样也不走调起.—— 特别注意留心
4:成功调起app后,app的右上角的 state bar有在safari(letv.com)中打开的选项,如果你点击了它,它会跳转到safari,同时系统会认为你选择使用safari打开该域名的链接,而不调起app。以后你再点击该链接,它只会在safari里面跳转。
该如何再次开启:
(1) 在safari页面中,手指往下拉动一下页面,会显示出一个“隐藏”的banner,俗称 smart banner,右侧是一个button:打开(open),点击它,就又会开启app跳转功能。
(2) 把链接粘贴到备忘录中,长按后选择 在XXAPP中打开。