美文网首页
cocos creator接入微信登陆sdk ios篇

cocos creator接入微信登陆sdk ios篇

作者: 程序猿TODO | 来源:发表于2021-07-16 11:46 被阅读0次

前言

iOS申请证书(.p12)和描述文件(.mobileprovision)一文里面我们讲述了.p12和.mobileprovision文件的申请。
由于接入微信登陆SDK需要配置Unuversal Links,将在本文步骤2写明如何配置,若没有配置则会出现由于应用universal link校验不通过,无法完成微信登陆的错误提示。

环境

Xcode12.5

步骤

1.去微信开放平台下载ios平台所需要的sdk
2.配置Unuversal Links
(1)苹果开发者账号打开配置

(2)XCode工程配置

打开Associated Domains开关,将Universal Links域名加到配置上

如果没有Associated Domains选项,则添加。


(3)配置指定文件:创建一个内容为json格式的文件,苹果将会在合适的时候,从我们在项目中填入的域名请求这个文件。这个文件名必须为apple-app-site-association切记没有后缀名,文件内容大概是这样子:
{
    "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。登陆开发者中心,在Account -> Membership里面可以找到Team ID。

paths:设定你的app支持的路径列表,只有这些指定的路径的链接,才能被app所处理。星号的写法代表了可识 别域名下所有链接。

(4)把文件apple-app-site-association,放置在服务器的根目录(告诉后台,后台就知道怎么做),然后让他提供一个https的url地址,格式是“正式域名/apple-app-site-association”,如:https://www.baidu.com/apple-app-site-association

达到的效果是,浏览器打开这个地址,可以下载这个文件。另外用GET请求这个地址,返回文件的JSON内容(这里通过工具Postman进行试验)

注意,返回的数据,不能存在乱码,否则说明JSON文件有问题。

如果后台提供的url地址是https://www.baidu.com/apple-app-site-association。那么,
Associated Domains中填写applinks:www.baidu.com
代码注册方法及微信开放平台中都填https://www.baidu.com/

因为我们在苹果开发者账号修改了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添加到依赖中

微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。如果需要使用的话开发者需要在工程中链接上: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协议

9.以上都添加完成后,开始写代码逻辑
a) 在主文件中引入WXApi.h,并定义好需要用到的参数code

b)在didFinishLaunchingWithOptions函数中向微信终端注册你的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)添加回调方法

-(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定义的全局函数
        }
    }
    
}
//定义参数的返回
-(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)定义触发微信登录的函数

+(void)sendAuthRequest
{
    if([WXApi isWXAppInstalled]){//判断微信是否安装
        //构造SendAuthReq结构体
    
        SendAuthReq* req =[[[SendAuthReq alloc ]init ] autorelease ];

        req.scope = @"snsapi_userinfo";

        req.state = @"123" ;

        //第三方向微信终端发送一个SendAuthReq消息结构

        [WXApi sendReq:req];
        //NSLog(@"微信登录 weixin login");
    }else{
    }
}

ios底层代码写好后,回到js中
首先需要点击登录按钮后拉取微信,需要调用OC代码中定义好的函数


微信登录成功后OC中拿到的code需要传到js当中,所以在js里面我们定义一个全局函数


全局函数中拿到了code,就可以拿去验证登录了,登录验证完成,再去调用一次底层代码清除掉code,这样就不会拿到重复的code了


微信登录完成!

问题总结

1.由于应用universal link校验不通过,无法完成微信登陆


未配置Unuversal Links或者配置错误

2.-canOpenURL: failed for URL: "weixinULAPI://" - error: "This app is not allowed to query


微信SDK1.8.6或以上版本都需要设置通用链接,按照流程下来一切都没问题,但是注册时提示(图1)问题,尝试后发现设置白名单的时候设置成了字典类型,导致微信获取不到的原因,只要设置成Array就可以了。


相关文章

网友评论

      本文标题:cocos creator接入微信登陆sdk ios篇

      本文链接:https://www.haomeiwen.com/subject/zyappltx.html