对于Cocos2d-JS项目要集成Facebook登录/交互功能,这是很多移动App开发经常碰到需求。官方也给出了教程。但我们在按照官方教程开发项目的时候,依然碰到一些问题,花费了不少时间。现在把这些问题记录下来,希望作为一个补充,能让同路的菜鸟们少走一点冤枉路。


官方教程:

Android平台上如何配置Facebook平台集成

相关资料:

Cocos2d-x的Facebook集成

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的代码实例。

第五步:

打包并安装到手机里进行测试。