前言:
由于蘋果iOS 13系統(tǒng)版本安全升級,為此微信openSDK在1.8.6版本進行了適配。 1.8.6版本支持Universal Links方式跳轉(zhuǎn),對openSDK分享進行合法性校驗。所以微信有關(guān)的SDK也要更新,就將微信分享和微信支付升級到了6.9.8版本. 在下面,我將結(jié)合微信的文檔,簡單梳理一下疑惑點....
1: 微信關(guān)于openSDK1.8.6的更新說明
2: 微信開放平臺移動應(yīng)用 SDK 更新提醒
3:檢測自己的Universal Links是否配置成功
1: 在蘋果開發(fā)中心Identifiers中配置Associated Domains, 之后把證書在更新一遍即可

associatedDomains.png
2: 在Xcode中使用Associated Domains,如果沒有找到,點擊下圖紅框里面的加號,添加即可.

a.png
假如我的服務(wù)域名是:https://blcokred.com, 即applinks:blcokred.com, 域名必須是https格式

b.png
3: 新建apple-app-site-association 文件
文件名必須為apple-app-site-association的json格式文件,文件名不需要添加的后綴。
//命名規(guī)則:
//1:appID將處理格式為的鏈接的應(yīng)用程序的標識;命名規(guī)則:TeamID+Bundle Id (TeamID 可以從開發(fā)者中心 -> Membership 中查看);
//2:paths應(yīng)用程序支持的網(wǎng)站各個部分,以路徑字符串數(shù)組形式指定。只有這些指定的路徑的鏈接,才能被app所處理, *符號寫法代表了可識別域名下所有鏈接。
{
"applinks": {
"apps": [],
"details": [
{
"appID": "G2A3GGAH67G.cn.wechat.abc",
"paths": ["*"]
}
]
}
}
//3: 上傳 apple-app-site-association文件到域名的根目錄或者.well-known子目錄下;
// 在瀏覽器中能打開https://域名 或 https://域名/apple-app-site-association
// 或 https://域名/.well-known/apple-app-site-association。
4: 在Xcode中info中配置參數(shù), 添加weixinULAPI、wechat、weixin,如下圖

c.png
5: 在微信開發(fā)者中心設(shè)置Universal Links

d.png
6: 在AppDelegate里面設(shè)置相對應(yīng)的方法
#define UNIVERSAL_LINK @"https://blcokred.com/"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self setWechatSetting];
}
/**
* 設(shè)置微信相關(guān)信息
*/
-(void) setWechatSetting {
#ifdef DEBUG
/*在register之前打開log, 后續(xù)可以根據(jù)log排查問題*/
[WXApi startLogByLevel:WXLogLevelDetail logBlock:^(NSString *log) {
NSLog(@"WeChatSDK: %@", log);
}];
#endif
/*注冊微信支付*/
[WXApi registerApp:SQ_WECHATPAY_KEY universalLink:UNIVERSAL_LINK];
#ifdef DEBUG
/*調(diào)用自檢函數(shù)(支付或者分享成功之后要刪除這個方法,不然會導(dǎo)致會每次打開app都會與微信進行關(guān)聯(lián))*/
[WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
NSLog(@"---------%@, %u, %@, %@", @(step), result.success, result.errorInfo, result.suggestion);
}];
#endif
}
打印如下:
app[14232:3095208] ---------0, 1, check passed,
app[14232:3095208] ---------1, 1, check passed,
app[14232:3095208] ---------2, 1, check passed,
app[14232:3095208] ---------3, 1, check passed,
app[14232:3095208] ---------4, 1, check passed,
app[14232:3095208] ---------5, 1, Universal Link check passed. The application is launched by WeChat via Universal Link,
app[14232:3095208] ---------6, 1, All Check Passed!,
如果調(diào)用友盟分享的時候,切記
/* 配置微信平臺的Universal Links
* 微信和QQ完整版會校驗合法的universalLink,不設(shè)置會在初始化平臺失敗
*/
[UMSocialGlobal shareInstance].universalLinkDic = @{@(UMSocialPlatformType_WechatSession):UNIVERSAL_LINK};
重寫 AppDelegate 的 handleOpenURL 和 openURL 方法:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [WXApi handleOpenURL:url delegate:self];
}
// 9以后會走這個
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0){
return [WXApi handleOpenURL:url delegate:self];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:self];
}
重寫AppDelegate或SceneDelegate的continueUserActivity方法
/* 設(shè)置Universal Links系統(tǒng)回調(diào) */
-(BOOL) application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
return [WXApi handleOpenUniversalLink:userActivity delegate:self];
}
/* 適配了SceneDelegate的App,系統(tǒng)將會回調(diào)SceneDelegate的continueUserActivity方法,所以需要重寫SceneDelegate的該方法 */
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
[WXApi handleOpenUniversalLink:userActivity delegate:self];
}
程序要實現(xiàn)和微信終端交互的具體請求與回應(yīng),因此需要實現(xiàn) WXApiDelegate 協(xié)議的兩個方法:
#pragma mark - WXApiDelegate
//如果第三方程序向微信發(fā)送了 sendReq 的請求,那么 onResp 會被回調(diào)。sendReq 請求調(diào)用后,會切到微信終端程序界面。
//微信支付成功之后,會在此處回調(diào),發(fā)個通知給到對應(yīng)的界面,來接收支付成功之后的頁面跳轉(zhuǎn)情況
- (void)onResp:(BaseResp *)resp {
if([resp isKindOfClass:[PayResp class]]){
[[NSNotificationCenter defaultCenter] postNotificationName:sg_kWechatPayResultNoti object:self userInfo:@{@"resp":resp}];
}
}
//是微信終端向第三方程序發(fā)起請求,要求第三方程序響應(yīng)。第三方程序響應(yīng)完后必須調(diào)用 sendRsp 返回。在調(diào)用 sendRsp 返回時,會切回到微信終端程序界面。
-(void) onReq:(BaseReq*)reqonReq {
}