cocos creator接入微信登陸sdk ios篇

前言

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) 重寫handleOpenURLopenURL方法

- (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就可以了。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容