大佬教程收集整理的这篇文章主要介绍了cocos2dx中IOS/Android跨平台微信登录和分享,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
后来在网上看到一篇文章,用他的思路成功实现了跨平台的实现,用起来还是挺简单的,思路也比较清晰。
文章连接:Cocos2d-x 集成微信分享功能
具体实现请参考文章,这里说一下微信登录功能的实现。
一、分享和登录的不同
分享比较简单,申请appid后,成功调起微信就可以分享成功了,其实分享也有结果返回,不过上面的文章中没有进行处理。
登录则要麻烦不少,首先登录分为好几个步骤:
这中间就涉及到http的调用,异步的回调,json结果解析等实现。
二、具体实现
1、ios端
因为前面提过的文章没有说明如何去实现微信回调,这里提一下:
1.1、在AppController.mm文件中,添加回调handLeopenUrl:
//这样,微信的回调就去调用到WXApiManager中去,WXApiManager需要实现WXApiDelegate接口 - (BOOL)application:(UIApplication *)application handLeopenURL:(NSURL *)url { return [WXApi handLeopenURL:url delegate:[WXApiManager sharedManager]]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication Annotation:(id)Annotation { return [WXApi handLeopenURL:url delegate:[WXApiManager sharedManager]]; }1.2、WXApiManager需要实现WXApiDelegate协议,主要是onResp和onReq接口
@interface WXApiManager : NSObject<WXApiDelegate> + (instanCETypE)sharedManager; @end //WXApiManager.mm文件 @implementation WXApiManager #pragma mark - LifeCycle +(instanCETypE)sharedManager { static dispatch_once_t onCEToken; static WXApiManager *instance; dispatch_once(&onCEToken,^{ instance = [[WXApiManager alloc] init]; }); return instance; } - (void)dealloc { [super dealloc]; } #pragma mark - WXApiDelegate - (void)onResp:(BaseResp *)resp { //这里去调用SocialUtils中的具体实现接口 SocialUtils::wxRespForIos(resp); } - (void)onReq:(BaseReq *)req { } @end
1.3、调用httprequest,异步发起http请求,其实httprequest是对curl的一个封装,send请求会自动创建线程
//SocialUtils_ios.mm void SocialUtils::wxRespForIos(void* resp){ auto authResp = static_cast<SendAuthResp*>(resp); if(authResp == nullptr) return; char url[256]; sprintf(url,WX_ACCESS_TOKEN_URL,WX_APP_ID,WX_SECRET,[[authResp code] UTF8String]); CCLOG("%s",url); //使用httprequest,异步调用http请求,这里可以简单使用CC_CALLBACK_2来实现回调函数封装 httpUtils::requesthttp(std::bind(SocialUtils::onResponse,CMD_ACCESS_TOKEN,std::placeholders::_1,std::placeholders::_2),url,"",httprequest::Type::GET,10); }
1.4、看看httpUtils具体实现
//网络异步连接方法 void httpUtils::requesthttp(httpUtilsCallBACk callBACk,const char* url,const char* data,network::httprequest::Type type,int timeout){ network::httprequest* request = new network::httprequest(); //设置请求类型 request->setrequestType(typE); request->setUrl(url); //设置回调函数 request->setResponseCallBACk(std::bind(httpUtils::onResponse,callBACk,std::placeholders::_2)); request->setrequestData(data,strlen(data)); network::httpClient* httpClient=network::httpClient::geTinstance(); //设置超时时间 httpClient->setTimeoutForConnect(timeout); httpClient->setTimeoutForRead(timeout); httpClient->send(request); request->release(); } void httpUtils::onResponse(httpUtilsCallBACk callBACk,httpClient *client,httpResponse *responsE){ if(callBACk == nullptr){ return; } if(!responsE) { std::string temp(""); callBACk(temp,ERROR); CCLOG("Log:response =null,plase check it."); return; } //请求失败 if(!response->isSucceed()) { std::string temp(""); callBACk(temp,ERROR); CCLOG("ERROR BUFFER:%s",response->getErrorBuffer()); return; } int codeIndex=response->getResponseCode(); const char* tag=response->gethttprequest()->getTag(); //请求成功 std::vector<char>* buffer=response->getResponseData(); std::string temp(buffer->begin(),buffer->end()); callBACk(temp,SUCCUSS); }
1.5 处理最终回调,会根据请求类型,做不同处理
//httprequest的回调函数,处理微信返回的json信息 void SocialUtils::onResponse(int cmd,std::string& data,int status){ if(status == httpUtils::ERROR){ CCLOG("HelloWorld::onResponse,ERROR=%d",status); return; } rapidjson::Document readdoc; readdoc.Parse<0>(data.c_str()); if(readdoc.HasParseError()) { CCLOG("GetParseError=%d\n",readdoc.GetParseError()); } switch(cmd){ case CMD_ACCESS_TOKEN://获取到access_token if(readdoc.HasMember("access_token")){ const char* access_token = readdoc["access_token"].GetString(); const char* openid = readdoc["openid"].GetString(); char url[256]; sprintf(url,WX_user_iNFO_URL,access_token,openid); CCLOG("%s",url); //继续请求用户信息 httpUtils::requesthttp(std::bind(SocialUtils::onResponse,CMD_user_iNFO,10); } break; case CMD_user_iNFO://获取用户信息 if(_node != nullptr){ ViewUtils::showToast(_node,data,5); } break; } }
至此,所有处理完成,拿到了用户的最终信息。当然,这只是客户端的处理,拿到open_id其实就可以请求服务端进行登录处理了。
2、Android端处理
Android上,处理思路也是一样,在微信的回调时,从Java端调用Native代码,只要将code返回就可以了。native拿到code后,处理和ios后续完全一样。
2.1 添加java端,native代码映射
package org.cocos2dx.cpp.tools; public class JniHelper { public static native void onResp(String codE); }
2.2 java处理微信回调
微信回调,需要在包名的目录下,建立一个wxapi目录,在其中创建一个WXEntryActivity,继承Activity,实现IWXAPIEventHandler接口,所有回调都会在这里处理。
<activity android:name=".wxapi.WXEntryActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="porTrait" android:theme="@android:style/Theme.Translucent.NotitleBar" /> @Override public void onResp(BaseResp baseResp) { SendAuth.Resp resp = (SendAuth.Resp)baseResp; //调用native代码 JniHelper.onResp(resp.codE); Log.d("","tet"); this.finish(); }
2.3 native代码处理调用
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //必须是C语言的函数,因为C++的函数会有不同的符号生成规则 //1.Java_:是格式,必须加的 //2.org_cocos2dx_cpp_tools_JniHelper:是包名+类名 //3.onResp:是Andriod工程中声明的名字 //4.中间需要_分开 extern "C"{ //给android调用的native代码,微信回调后会调用这个函数 JNIEXPORT void Java_org_cocos2dx_cpp_tools_JniHelper_onResp(JNIEnv *env,jobject thiz,jString codE) { const char *szCode = env->GetStringUTFChars(code,null); char url[256]; sprintf(url,szCodE); CCLOG("%s",url); //调用httprequest去请求微信api,设置回调函数 httpUtils::requesthttp(std::bind(SocialUtils::onResponse,SocialUtils::CMD_ACCESS_TOKEN,10); env->ReleaseStringUTFChars(code,szCodE); } } #endif
结语
有了上面的框架后,其他sdk的集成都大同小异,稍微麻烦点就是了。
以上是大佬教程为你收集整理的cocos2dx中IOS/Android跨平台微信登录和分享全部内容,希望文章能够帮你解决cocos2dx中IOS/Android跨平台微信登录和分享所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。