cocos creator接入微信登陆sdk ios篇
前言
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) 重写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)添加回调方法
-(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就可以了。
