最近項目中,微信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中打開。