cocoscreator原始碼_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小玉米
公眾號會不定期釋出各種程式設計經驗。
也可以點選下方原文獲取程式碼原始碼。