cocos快速集成原生微信登录分享功能源码分享-by creator小玉米

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

image

也欢迎您关注微信公众号:creator小玉米

公众号会不定期发布各种编程经验。

2赞