cocos creator快速集成原生微信登录分享功能源码分享
前言
由于很多nativeApi用户都在咨询sdk相关的问题,所以我把项目里的微信登录分享功能剥离封装了一个wechat-quick,分享给大家使用。欢迎交流拍砖。
wechat-quick简介
wechat-quick是基于cocos creator对原生微信登录和分享功能的一个封装。项目包含2部分,creator模块和原生模块。creator部分是js语言实现,js部分主要功能封装在一个WechatModule.js文件中,主要包含三部分功能:
1.调用oc和java的原生微信登录分享接口;
2.登录和分享的全局回调函数;
3.保存登录token方便下次快捷登录;
原生模块是通过反射和js模块互调。具体登录和分享功能都是实现在原生模块WechatModule.java和WechatModule.mm文件中。
原生模块的全部代码都放在了build-templates。用户可以直接构建编译,自动把大部分代码集成在项目中。
wechat-quick项目目录结构:
wechat-quick有两个目录:
1.assets目录,是js代码,里面有封装了一个WechatModule.js 以及需要定义全局回调的Global.js。全部的接口,登录分享以及原生回调等功能都在WechatModule.js文件内。
2.build-templates文件夹,原生的代码sdk都在这里。构建的时候可以自动拷贝到项目下。也可以选择自行拷贝。
WechatModule.js参考
//初始化接口 需要传入appId和secret
initWx: function (appId, appSecret) {
this.appId = appId;
this.appSecret = appSecret;
if (gg.isAndroid === true) {
return jsb.reflection.callStaticMethod(
wxClassPath,
"initWx",
"(Ljava/lang/String;Ljava/lang/String;)V", appId, appSecret);
} else if (gg.isIOS === true) {
return jsb.reflection.callStaticMethod("WeChatModule", "initWx:andSecret:", appId, appSecret);
}
return true;
},
//判断是否安装微信
isInstallWx: function() {
if (gg.isAndroid === true) {
return jsb.reflection.callStaticMethod(
wxClassPath,
"isInstallWx",
"()Z");
} else if (gg.isIOS === true) {
return jsb.reflection.callStaticMethod("WeChatModule", "isInstallWx");
}
return true;
},
//类内部微信登录调用接口,直接调用sdk
loginWx: function () {
if (gg.isAndroid === true) {
jsb.reflection.callStaticMethod(
wxClassPath,
"loginWx",
"()V");
} else if (gg.isIOS === true) {
jsb.reflection.callStaticMethod("WeChatModule", "loginWx");
}
},
//分享图片到微信 type = 0 微信好友 1朋友圈
shareImageWx: function (imgPath, type) {
if (gg.isAndroid === true) {
jsb.reflection.callStaticMethod(
wxClassPath,
"shareImageWx",
"(Ljava/lang/String;I)V", imgPath, type);
} else if (gg.isIOS === true) {
jsb.reflection.callStaticMethod("WeChatModule", "shareImageWx:andType:", imgPath, type);
}
},
//分享文字到微信 type = 0 微信好友 1朋友圈
shareTextWx: function (text, type) {
if (gg.isAndroid === true) {
jsb.reflection.callStaticMethod(
wxClassPath,
"shareTextWx",
"(Ljava/lang/String;I)V", text, type);
} else if (gg.isIOS === true) {
jsb.reflection.callStaticMethod("WeChatModule", "shareTextWx:andType:", text, type);
}
},
//分享连接到微信 type = 0 微信好友 1朋友圈
shareUrlWx: function (url, title, desc, type) {
if (gg.isAndroid === true) {
jsb.reflection.callStaticMethod(
wxClassPath,
"shareUrlWx",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V", url, title, desc, type);
} else if (gg.isIOS === true) {
jsb.reflection.callStaticMethod("WeChatModule", "shareUrlWx:andTitle:andDesc:andType:", url, title, desc, type);
}
},
外部调用登录接口,会先检查本地缓存,如果有缓存就直接调用刷新token接口进行登录。
//微信登录
login: function () {
let strToken = cc.sys.localStorage.getItem(KeyRefreshToken);
var self = this;
if (strToken)
{
...
http.get({url:kUrl,timeout:10000},function(err,result) {
...
}.bind(self));
return true;
}
//检查是否安装微信
if (this.isInstallWx() === false) {
gg.fun.showAlert('微信登录失败,请检查是否安装微信');
return false;
}
return this.loginWx();
},
//微信分享回调接口,oc和java会在原生层回调此函数
onWxShareResultCallback: function (result, msg) {
},
//清除记录的缓存
resetWx: function () {
cc.sys.localStorage.removeItem(KeyRefreshToken);
},
调用流程:
先调用initWx用来初始化微信的appid和secret。(app运行周期只调用一次)
然后就可以调用login和share等接口。
集成过程中注意:
安卓需要修改一下包名以及代码中包名对应的引用。安卓需要修改下build.gradle 以便能成功下载到微信的sdk,同时还需要修改androidmanifest.xml,配置相关activity以及权限等,具体参考微信开放平台接入指南。
接入指南:
https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html
ios需要修改AppController.mm以及info.plist。配置相关内容。具体参考微信开放平台接入指南。
接入指南:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html
ios代码中提供的有一份AppController.mm的参考。
同时接入的时候还需要自己实现一个oc和java调用js的函数runJSCode来回调js函数。
java参考:
public static void runJsCode(final String code) {
// 一定要在 GL 线程中执行
app.runOnGLThread(new Runnable() {
@Override
public void run() {
Cocos2dxJavascriptJavaBridge.evalString(code);
}
});
}
oc参考:
+(void)runJsCode: (NSString *) code
{
const char *msg = [code UTF8String];
const char* strMsg = msg;
cocos2d::Application::getInstance()->getScheduler()- >performFunctionInCocosThread([=](){
se::ScriptEngine::getInstance()->evalString(strMsg);
});
}
最后
代码已经全部上传至:https://gitee.com/creator-li-yumi/wechat-quick
也可以加入下方qq群或者关注公众号获取代码,代码在群文件中。
如果您在使用过程中有什么疑问可以加qq:1101502561咨询。或者加入群:1093612606

也欢迎您关注微信公众号:creator小玉米
公众号会不定期发布各种编程经验。
