对于Cocos2d-JS项目要集成Facebook登录/交互功能,这是很多移动App开发经常碰到需求。官方也给出了教程。但我们在按照官方教程开发项目的时候,依然碰到一些问题,花费了不少时间。现在把这些问题记录下来,希望作为一个补充,能让同路的菜鸟们少走一点冤枉路。
官方教程:
相关资料:
Facebook API参考:
Facebook SDK for Cocos2d-JS API Reference
第一步:
当然是严格按照官方教程去做(https://github.com/chukong/cocos-docs/blob/master/manual/framework/html5/facebook-sdk/facebook-sdk-on-android/zh.md)。
这一步只要有足够的耐心应该不会出什么问题。但是我偏偏就在万分认真地添加完教程上所述的配置代码后,一打包就出现报错:
1
2
|
jni/../../Classes/AppDelegate.cpp:29:41: fatal error: jsb_cocos2dx_pluginx_auto.hpp: No such file or directory
#include "jsb_cocos2dx_pluginx_auto.hpp"
|
也就是说按教程Step5中所添加的两个文件jsb_cocos2dx_pluginx_auto.hpp和jsb_pluginx_extension_registration.h找不到。这个问题折腾了我整整一天,网上搜索出相同病症的帖子最终都没有解决方案。后来在官方论坛里发帖,最终搞明白其实是官方教程中Step3中那两句脚本造成的:
1
2
|
LOCAL_WHOLE_STATIC_LIBRARIES += jsb_pluginx_static
$(call import-module,cocos2d-x/plugin/jsbindings)
|
官方教程在这个地方说的有点问题,没有说明两句脚本应放置的位置。Android.mk中有一句include $(BUILD_SHARED_LIBRARY),第一句LOCAL_WHOLE_STATIC_LIBRARIES += jsb_pluginx_static应该放在该句的前面,而第二句$(call import-module,cocos2d-x/plugin/jsbindings)应该放在该句的后面,比如放在最后。当然这种错误对于一个熟悉C++的程序员来说是不大会犯的,但其实大多数Cocos2d-JS程序员都是C++菜鸟。
第二步:
用命令行编译项目:
1
|
cocos compile -p android
|
官方教程在这里就笼统地说了一下,我一开始没有重视,按习惯在Cocos Code IDE里直接打包,因为打包时会编译runtime。但是事实上C++的代码修改后,必须要用命令行编译项目,因为用Cocos Code IDE编译runtime,除非是这个项目第一次编译,否则很多步骤都会跳过(比如生成frameworks\runtime-src\proj.android\obj文件夹中的内容,除非你编译前把这个文件夹删除掉,否则不会重新编译)。这样打包时其实前面配置进去的那些代码根本没有编译进去,运行的时候报错找不到Facebook插件也就很自然了。
第三步:
要在项目的project.json文件中添加如下代码:
1
2
3
4
5
6
7
8
|
"modules" : ["cocos2d", "extensions", "external"],
"plugin": {
"facebook": {
"appId" : "829255073798315", //appId的值改成你自己的appId
"xfbml" : true,
"version" : "v2.0"
}
},
|
第四步:
在js中加入调用Facebook SDK接口的代码,比如:
初始化:
1
2
3
4
5
6
7
8
9
10
|
if(!cc.sys.isNative){
window.facebook = window.facebook || (window["plugin"] ? window["plugin"]["FacebookAgent"]["getInstance"]() : null);
}else{
cc.loader.loadJs('', [
"../../frameworks/cocos2d-html5/external/pluginx/platform/facebook_sdk.js",
"../../frameworks/cocos2d-html5/external/pluginx/platform/facebook.js"
],function(){
cc.log("Facebook js loaded!");
})
}
|
登录:
1
2
3
4
5
6
7
8
9
10
11
|
onLogin:function(){
if(facebook.isLoggedIn()){
cc.log("Facebook Logged in!");
}else{
facebook.login(function(type, msg){
fbData.userID = facebook.getUserID();
fbData.accessToken = facebook.getAccessToken();
}
);
}
}
|
写这些代码前,最好先去官方js-tests项目里仔细看一下Facebook SDK Test模块里的代码,有各种调用Facebook SDK api的代码实例。
第五步:
打包并安装到手机里进行测试。