前言
iOS申請證書(.p12)和描述文件(.mobileprovision)一文里面我們講述了.p12和.mobileprovision文件的申請。
由于接入微信登陸SDK需要配置Unuversal Links,將在本文步驟2寫明如何配置,若沒有配置則會出現(xiàn)由于應用universal link校驗不通過,無法完成微信登陸的錯誤提示。
環(huán)境
Xcode12.5
步驟
1.去微信開放平臺下載ios平臺所需要的sdk
2.配置Unuversal Links
(1)蘋果開發(fā)者賬號打開配置

(2)XCode工程配置
打開Associated Domains開關(guān),將Universal Links域名加到配置上

如果沒有Associated Domains選項,則添加。

(3)配置指定文件:創(chuàng)建一個內(nèi)容為json格式的文件,蘋果將會在合適的時候,從我們在項目中填入的域名請求這個文件。這個文件名必須為
apple-app-site-association,切記沒有后綴名,文件內(nèi)容大概是這樣子:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
說明:
appID:組成方式是 teamId.yourapp’s bundle identifier。如上面的 9JA89QQLNQ就是teamId。登陸開發(fā)者中心,在Account -> Membership里面可以找到Team ID。
paths:設(shè)定你的app支持的路徑列表,只有這些指定的路徑的鏈接,才能被app所處理。星號的寫法代表了可識 別域名下所有鏈接。
(4)把文件apple-app-site-association,放置在服務器的根目錄(告訴后臺,后臺就知道怎么做),然后讓他提供一個https的url地址,格式是“正式域名/apple-app-site-association”,如:https://www.baidu.com/apple-app-site-association。
達到的效果是,瀏覽器打開這個地址,可以下載這個文件。另外用GET請求這個地址,返回文件的JSON內(nèi)容(這里通過工具Postman進行試驗)

注意,返回的數(shù)據(jù),不能存在亂碼,否則說明JSON文件有問題。
如果后臺提供的url地址是https://www.baidu.com/apple-app-site-association。那么,
Associated Domains中填寫applinks:www.baidu.com,
代碼注冊方法及微信開放平臺中都填https://www.baidu.com/,
因為我們在蘋果開發(fā)者賬號修改了App ID配置,所以我們需要
重新生成描述文件
3.微信開放平臺配置
填寫正式域名
4.在“info”標簽欄的“URL type“添加“URL scheme”為你所注冊的應用程序id

5.在“info”標簽欄的“LSApplicationQueriesSchemes“添加weixin,如果你的“info”標簽欄里面沒有找到“LSApplicationQueriesSchemes“,請找到項目下/ios/info.plist—>Open As—>Source Code,添加下面的代碼
<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
<string>weixin</string>
<string>weixinULAPI</string>
</array>

6.將SDK文件中包含的 libWeChatSDK.a,WXApi.h,WXApiObject.h三個文件添加到你所建的工程中,并將libWeChatSDK.a添加到依賴中


微信開放平臺新增了微信模塊用戶統(tǒng)計功能,便于開發(fā)者統(tǒng)計微信功能模塊的用戶使用和活躍情況。如果需要使用的話開發(fā)者需要在工程中鏈接上:SystemConfiguration.framework, libz.dylib, libsqlite3.0.dylib, libc++.dylib, Security.framework, CoreTelephony.framework, CFNetwork.framework,CoreGraphics.framework
7.在你的工程文件中選擇Build Setting,在"Other Linker Flags"中加入-force_load $(PROJECT_DIR)/ios/WeChatSDK1.8.4/libWeChatSDK.a(你的libWeChatSDK的位置),我用的是默認的-ObjC $(inherited),在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h,文件所在位置(目錄),下面的User Header Search Paths我用的是默認的目錄。

8.在你需要使用微信終端API的文件中import WXApi.h頭文件,并增加 WXApiDelegate協(xié)議

9.以上都添加完成后,開始寫代碼邏輯
a) 在主文件中引入WXApi.h,并定義好需要用到的參數(shù)code

b)在didFinishLaunchingWithOptions函數(shù)中向微信終端注冊你的id

c) 重寫handleOpenURL和openURL方法
- (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 {
BOOL isSuc = [WXApi handleOpenURL:url delegate:self];
NSLog(@"url %@ isSuc %d",url,isSuc == YES ? 1 : 0);
return isSuc;
}
d)添加回調(diào)方法
-(void) onResp:(BaseResp*)resp{
if([resp isKindOfClass:[SendAuthResp class]])
{
SendAuthResp *aresp = (SendAuthResp *)resp;
if (aresp.errCode== 0) {
//_wxCode = aresp.code;
NSLog(@"resp.Code = %@",aresp.code);
isGetCode=1;
wxCode=aresp.code;
NSLog(@"wxCode = %@",wxCode);
[self callJsEngineCallBack:@"cc.jsEngineCallback" :wxCode]; //此處的cc.jsEngineCallback是creator里面js定義的全局函數(shù)
}
}
}
//定義參數(shù)的返回
-(void)callJsEngineCallBack:(NSString*) funcNameStr :(NSString*) contentStr
{
NSLog(@"callJsEngineCallBack...");
std::string funcName = [funcNameStr UTF8String];
std::string param = [contentStr UTF8String];
std::string jsCallStr = cocos2d::StringUtils::format("%s(\"%s\");",funcName.c_str(), param.c_str());
NSLog(@"jsCallStr = %s", jsCallStr.c_str());
se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str());
}
e)定義觸發(fā)微信登錄的函數(shù)
+(void)sendAuthRequest
{
if([WXApi isWXAppInstalled]){//判斷微信是否安裝
//構(gòu)造SendAuthReq結(jié)構(gòu)體
SendAuthReq* req =[[[SendAuthReq alloc ]init ] autorelease ];
req.scope = @"snsapi_userinfo";
req.state = @"123" ;
//第三方向微信終端發(fā)送一個SendAuthReq消息結(jié)構(gòu)
[WXApi sendReq:req];
//NSLog(@"微信登錄 weixin login");
}else{
}
}
ios底層代碼寫好后,回到js中
首先需要點擊登錄按鈕后拉取微信,需要調(diào)用OC代碼中定義好的函數(shù)

微信登錄成功后OC中拿到的code需要傳到js當中,所以在js里面我們定義一個全局函數(shù)

全局函數(shù)中拿到了code,就可以拿去驗證登錄了,登錄驗證完成,再去調(diào)用一次底層代碼清除掉code,這樣就不會拿到重復的code了


微信登錄完成!
問題總結(jié)
1.由于應用universal link校驗不通過,無法完成微信登陸

未配置Unuversal Links或者配置錯誤
2.-canOpenURL: failed for URL: "weixinULAPI://" - error: "This app is not allowed to query

微信SDK1.8.6或以上版本都需要設(shè)置通用鏈接,按照流程下來一切都沒問題,但是注冊時提示(圖1)問題,嘗試后發(fā)現(xiàn)設(shè)置白名單的時候設(shè)置成了字典類型,導致微信獲取不到的原因,只要設(shè)置成Array就可以了。
