cocos2d−xのFacebook連携(iOS、Android)

cocos2dx_portrait

 

最近cocos2d−xにてFacebook連携を実装しました。
iOSは割と簡単にできたのですが、AndroidがiOSの3倍ぐらい労力使いました。

最初から最後まで懇切丁寧に解説しているサイトも少なかったので、自身の復習の意味でもまとめておこうと思います。

 

0.準備

Facebook連携アプリを作成するには、Facebook Developersに登録後、アプリを登録しなければなりません。
おそらくサイト見ながらやっていけばつまずくことはないので、ここでは割愛します。
https://developers.facebook.com

 

1.iOS編

SDKBOXを利用します。
(SDKBOXはcocos2d−xのプロジェクトにサポートしているSDKをインストールするプラグインです。)

これを使えば、いろいろ面倒なSDKの追加をコマンド1行でできます。すごい!
やり方は公式サイト(英語)のやり方とほぼ一緒です。

1.1.Facebook Pluginの入手

ここからFacebookのPluginを入手します。
「Auto Installer」をダウンロードしましょう。
ダウンロード後、解凍まで行います。

1.2.import

ターミナルから対象とするcocos2d−xのプロジェクトのディレクトリまで移動します。
そこで、1.1.で解凍したsdkboxをターミナルまでドラッグし、パス付きで指定します。
その後に、「import Facebook」をつけてください。

~~~~/sdkbox import Facebook

ズラズラっと表示された後に、Installation Successfulと表示されれば成功です。
これでプロジェクトにFacebookのプラグインが導入されました。
プロジェクトの「proj.ios_mac」以下にいろいろ追加されているのが確認できます。

スクリーンショット 2015-10-27 21.44.23

プロジェクトにも勝手に追加されてますね。
スクリーンショット 2015-10-30 22.22.20

1.3.info.plistの修正

info.plistを修正します。
1.3.、1.4.は公式サイトを見た方が早いですね。
「For iOS Developers」の手順になります。

以下の項目を追加します。
スクリーンショット 2015-10-30 21.39.46

1.4.AppController.mmを修正します。

applicationDidBecomeActiveの修正。

スクリーンショット 2015-10-30 22.13.33

didFinishLaunchingWithOptionsの修正。

スクリーンショット 2015-10-30 22.12.37

メソッド追加。

スクリーンショット 2015-10-30 22.13.43

1.5.AppDelegate.cppの修正

import文を追加。

#import <PluginFacebook/PluginFacebook.h>

applicationDidFinishLaunching内に、以下を追加。

sdkbox::PluginFacebook::init();

1.6.実行

あとは、利用したい箇所で、AppDelegate.cppと同様のimport文を追加し、
処理を書いていくだけです。

処理はログインやらシェアやら色々できるみたいです。
ここを参照してください。
http://sdkbox-doc.github.io/en/plugins/facebook/v3-cpp/

私はシェアのみ実装したので、以下のような感じです。

void ConfigLayer::facebook(){

    // facebookでシェア
    sdkbox::FBShareInfo info;
    info.type  = sdkbox::FB_LINK;
    info.link  = "http://www.cocos2d-x.org";
    info.title = "cocos2d-x";
    info.text  = "Best Game Engine";
    info.image = "http://cocos2d-x.org/images/logo.png";
    sdkbox::PluginFacebook::dialog(info);

}

 

2.Android編

私の環境では、SDKBOXでAndroidへの導入はできませんでした。
公式の手順通りに実施してもエラーとなりました。
(コメントを見ると同じような方がいらっしゃいますが、環境依存なのかは不明ですね。。)

上記の理由から、SDKの導入を手動で行いました。
下記のサイトが非常に参考になります。
http://d.hatena.ne.jp/nkawamura/20150615/1434316251

2.1.KeyHashの作成、登録

Facebookのページに載ってますが、以下のコマンドをターミナルで叩き、パスワードを入力して取得します。

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64

作成されたものをFacebookのアプリのページのAndroidのKey Hashesに貼り付けます。

スクリーンショット 2015-10-30 22.50.35

2.2.AndroidManifest.xmlの修正

applicationタグ内に追加されているはずですが、私の環境ではエラーになっていたので、削除し、下記を追記しました。

    <activity android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:label="@string/app_name" android:name="com.facebook.FacebookActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" />
    <provider android:authorities="com.facebook.app.FacebookContentProviderXXXX" android:exported="true" android:name="com.facebook.FacebookContentProvider" />

com.facebook.app.FacebookContentProviderXXXXのXXXXはFacebookアプリのAppIDです。

2.3.res/values/strings.xmlの修正

「facebook_app_id」というのが追加されているので、2.2.同様にFacebookアプリのAppIDを追記します。

<string name="facebook_app_id">XXXX</string>


2.4.FacebookSDKのインポート

ここが色々大変です。
基本的な手順は、ここ通りです。
http://stackoverflow.com/questions/29379890/android-facebook-sdk-4-in-eclipse

英語ですがかなり丁寧に書かれており、画像も多いのでそんなに迷わないと思います。
(SDKのバージョンは、2015/10/30の最新は4.7.0ですが、変なエラー等があると怖いので、私は4.2.0を利用しました。)

そんな中でもつまずいた箇所を記載します。

com.facebook.Rのエラー
見つからないとエラーが出ました。
Androidのバージョンが悪かったようで、Facebookプロジェクト右クリック→プロパティ→Androidから、バージョンを4.4.2に変更したら解消されました。

スクリーンショット 2015-10-30 23.24.23

android−support−v4.jarのエラー
Facebook側に追加したjarですが、対象のプロジェクトにも追加しないとエラーとなるので、追加します。

順序およびエクスポートタブでチェックも必要です。

スクリーンショット 2015-10-31 0.22.23

2.5.AppActivityの修正

例によってシェアしか実装していませんので、その例のみです。
onCreateメソッドをOverrideして作成します。

    private static Context context = null;
    private static ShareDialog shareDialog;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        context = this;        

        FacebookSdk.sdkInitialize(getApplicationContext());
        shareDialog = new ShareDialog(this);

    }

呼び出すメソッドを追加します。

    public static void facebook(){

        // facebookでシェア
        final Activity activity = (Activity) context;
        activity.runOnUiThread(new Runnable() {
          public void run() {
        	  if (ShareDialog.canShow(ShareLinkContent.class)) {
        		    ShareLinkContent linkContent = new ShareLinkContent.Builder()
        		            .setContentTitle("Hello Facebook")
        		            .setContentDescription(
        		                    "The 'Hello Facebook' sample  showcases simple Facebook integration")
        		            .setContentUrl(Uri.parse("http://developers.facebook.com/android"))
        		            .build();

        		    shareDialog.show(linkContent);
        		}
          }
        });
    }

 

2.6.実行

後はJava側で用意したメソッド(上記例だとfacebook())をcocos2dx側から呼び出せば完了です。
(cocos2dxとネイティブの連携については検索すればたくさん出るのでここでは割愛します。)

 
 
 

なんとか実装できましたが、かなり時間がかかってしまいました。
SDKBOXでもAndroidがすんなり行けば良かったのですが。。
何かやり方を知っている方がいらっしゃれば教えて下さい。