【Cocos2d-x】【Android】ニフティクラウド mobile backendのプッシュ通知を組み込む

- mBaasの公式ではCocos2d-xはサポートされていないため、私と同じく色々な事情からどうしてもニフティクラウドのmobile backendのプッシュ通知を既存のCocos2d-xプロジェクトで使いたい、という人の役に少しでも立てればと思い執筆しました。
- Cocos2d-x framework 3.8を使用しています。
- NCMB 2.2.1を使用しています。
- 筆者の環境では、proj-androidフォルダが作成されないため、AndroidStudioを直接使わずに導入する方法の解説となります。(jarファイルの入手のため、一部使用します)
- 基本的には[ドキュメント](http://mb.cloud.nifty.com/doc/current/)の[クイックスタート](http://mb.cloud.nifty.com/doc/current/introduction/quickstart_android.html)と[プッシュ通知_基本的な使い方](http://mb.cloud.nifty.com/doc/current/push/basic_usage_android.html)に沿えば実装可能ですが、一部ドキュメントに書かれている通りに実装しようとすると、筆者の場合躓く箇所があったため、その点を補足する形になっています。

# jarファイルの入手と設置

- proj-androidフォルダが無いCocos2d-xプロジェクトでは、AndroidStudioで直接編集出来ないため、Gradleが利用出来ません。
- そこで、jarファイルを入手し、libsフォルダに設置する必要があります。

## 事前準備

1. AndroidStudioで既存のプロジェクトを開きます。(無ければ新規プロジェクトを作成してください)
2. build.gradleのdependenciesに以下を追加しSyncします。

```

compile 'com.google.code.gson:gson:2.3.1'

```

3. AndroidStudioメニューのTools -> Android -> SDK Manager をクリックします。
4. Launch Standalone SDK Manager をクリックします。
5. Extras の Android Support Library, Google Play services の Status が Not installed の場合、チェックを付け、右下の「install 2 package...」 をクリックし、インストールします。
  - この時、Name の項目にマウスオーバーし続けると、ファイルが置かれる(置かれた)パスが表示されます。

![sdk_manager_path.png](https://qiita-image-store.s3.amazonaws.com/0/65286/b1ad17ea-28a7-8355-a6e9-9a5dc689f4d9.png)

## 各jarファイルの場所

- 下記を参考にし、libsフォルダにjarファイルを入れてください。

### GSON 2.3.1

- [参考にさせて頂いた記事](http://qiita.com/opengl-8080/items/4c1aa85b4737bd362d9e#maven2-%E3%81%AE%E3%82%BB%E3%83%B3%E3%83%88%E3%83%A9%E3%83%AB%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B-jar-%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88)

```

(ホームディレクトリ)/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson

```

### android-support-v4, android-support-v7-appcompat

```

(ホームディレクトリ)/Library/Android/sdk/extras/android/support/v7/appcompat/libs

```

### Google Play Services

- こちらは、jarファイル単体ではなく、フォルダを追加してください。

```

(ホームディレクトリ)/Library/Android/sdk/extras/google/google_play_services/libproject

```

- フォルダを追加後、proj.android直下のproject.propertiesを開き、一行追加します。

```

android.library.reference.1=libs/google-play-services_lib

```

# パッケージ名に合わせたフォルダの生成とファイルの設置

- 筆者の環境では、パッケージ名をデフォルトから変更しているため、以下のmeta-dataの値を使用する[この箇所](https://github.com/NIFTYCloud-mbaas/ncmb_android/blob/6427d50541804832fc9150c06c08628edb4eb9b0/ncmb-core/src/main/java/com/nifty/cloud/mb/core/NCMBGcmListenerService.java#L120-L121)の処理が問題になりました。
- そこで、以下の画像のように proj.android/src の直下にパッケージ名に合わせたフォルダを作成し、そこにjavaファイルを作成し、配置しました。

![スクリーンショット 2016-03-16 3.39.35.png](https://qiita-image-store.s3.amazonaws.com/0/65286/99e34397-07f8-db90-cc3b-912ecbeb3f10.png)

- 生成したフォルダに設置したOpenPushStartActivityには以下のように記述しています。

```

package (生成したフォルダ構造に合わせたパッケージ名)

import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxHelper;

import android.os.Bundle;

public class OpenPushStartActivity extends Cocos2dxActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

```

# AndroidManifestへの追記

- Manifestに追加したActivityの記述を以下のように追加しておきます。

```

<activity
    android:configChanges="orientation"
    android:label="@string/app_name"
    android:name="(生成したフォルダ構造に合わせたパス)"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
</activity>

```
## meta-dataの記述

- タップされた時に起動するActivityを指定するmeta-dataには以下のように記述しました。

```

<meta-data
    android:name="openPushStartActivity"
    android:value=".OpenPushStartActivity" />

```

- 以上がドキュメントの補足説明になります。

# 余談

- 当初は [app C cloudのプッシュ通知サービス](https://app-c.net/merit1/push.html)を使用する予定でしたが、タイミングが悪いことに2016年3月1日より新規登録を停止しており、問い合わせると、プッシュ通知サービスが再び利用出来るのが5月以降との返答でした。(納期に間に合わないためこの時点で選択肢から消えました)
- [Growth Push](http://ja.growthpush.com/)もapp C cloud同様Cocos2d-xに対応しているようでしたが、こちらは累積1,000,000リクエストを超えると有料だったため、選択肢から消えました。
- 紆余曲折の後、消極的選択ですがニフティのmBaasを使うことになり、今回案の定他のCocos2d-x非対応のサービス導入時に起きた苦労が生じたため、このような記事を執筆しました。(導入する必要に迫られたサービスに限って、「Cocos2d-x?知らない子ですね」なので…Unityはサポートされている事が多い気がします)
- 間違いや抜けがある可能性がありますので、もしあれば、ご指摘戴ければ幸いです。