【GrowthPush】Cocos2d-xプロジェクトへのSDK組み込み方法まとめ

# はじめに
GrowthPushの公式ドキュメントは、個人的にあんま当てにしない方が良い気がする。
いきなり本命プロジェクトじゃなくて、テストプロジェクトを ```cocos new``` して練習することをオススメする。

# iOS/Android 共通でやること
## SDKダウンロード
下からcocos2d-x用のSDKをダウンロード。(直DLリンクです。)
*執筆時: v1.1.3*
https://growthpush.com/downloads/cocos2dx3/libraries/latest

## GrowthPushクラスの組み込み
Xcodeから、 ```Classes/``` 配下にダウンロードしてきた ```growthpush-cocos2dx3-v.1.1.3/Classes/GrowthPush``` を *Add File to "プロジェクト名" ...* する。
**この時「Copy items if needed」にチェックを入れるのを忘れないように。**

## ソース書き書き
ソース書き書きは、iOS/Androidの各SDK組み込みのあとに記述。

# iOS向けにやること
## iOS用SDKダウンロード
cocos用のだけでなく、iOS/Androidの各プラットフォーム用のSDKも必要。
まずはiOS用のSDKをダウンロード。(直リン)
https://growthpush.com/downloads/ios/libraries/latest

## Frameworkの追加
Xcodeでプロジェクトファイルの[General]タブを開き、一番下の[Linked Frameworks and Libraries]にフレームワークファイルを追加する。

1. [+]ボタン
2. [Add Other...]ボタン
3. iOS用SDKの ```growthpush-ios/GrowthPush.framework``` を追加

> 図解:
> ![01.png](https://qiita-image-store.s3.amazonaws.com/0/85825/1a689183-757f-50b1-4121-169a7855d090.png)
> 
> ![02.png](https://qiita-image-store.s3.amazonaws.com/0/85825/33a7c931-2324-2007-1fb8-0efcb0ab769c.png)
> 
> ![03.png](https://qiita-image-store.s3.amazonaws.com/0/85825/1617f646-4a1b-7fbb-f9d7-9325d9f8d134.png)

ここでもしシンボルが解決出来ないエラーが出るようであれば、以下の2つのフレーム笑0区ファイルをインポートすると解決出来るかもしれないらしい。(やってない。)

- Security.framework
- SystemConfiguration.framework

# Android向けにやること
## Android用SDKダウンロード
(直リン)
*執筆時: v1.1.4(※問題アリ。後述)*
https://growthpush.com/downloads/android/libraries/latest

## ちょっと待った。
Android用のSDKファイルのv1.1.4は、GrowthPushの人がビルドする時にミスってるっぽい。
詳しくは別に投稿してある。
http://qiita.com/hashimotoryoh/items/25302c874bc95bce74d8

↑という訳で、

1. ```growthpush-android-1.1.4/growthpush.jar``` を手動で ```.zip``` に拡張子変更
2. それを展開
3. 中に ```bin/growthpush-android.jar``` が有ることを確認

確認できたら次へ。
結局、無理やりパスを書くなら ```growthpush-android-1.1.4/growthpush.jar/bin/growthpush-android.jar``` これを次に使う。

## JARファイルの追加
JARファイルをプロジェクトに追加する。
上記に記した ```growthpush-android-1.1.4/growthpush.jar/bin/growthpush-android.jar``` を、

1. ```growthpush.jar``` にリネームする
2. cocosプロジェクトの ```proj.android/libs/``` 配下に配置する

あと2つ追加するJARファイルがある。
が、次の2つは既に有るものであれば無視して良い。配置場所は同じところ。

- ```growthpush-android-1.1.4/google-play-services.jar```
- ```growthpush-android-1.1.4/android-support-v4.jar``` (これについてはバージョンが違っていても、何かが入っていれば良い。)

## Android.mk の編集
cocosのプロジェクトの ```proj.android/jni/Android.mk``` に編集が必要。
```LOCAL_SRC_FILES``` と ```LOCAL_C_INCLUDES``` という変数にGrowthPushのソースのパスを追記する。

```mf:Android.mk
:
:

LOCAL_SRC_FILES := hellocpp/main.cpp \        # なんかこんな風に書いてるはず
                   ../../Classes/GrowthPush/android/GrowthPush.cpp        # これを末尾に追記

# 個人的には↓の書き方の方が好き。どっちでも良い。
# LOCAL_SRC_FILES := hellocpp/main.cpp
# LOCAL_SRC_FILES += ../../Classes/GrowthPush/android/GrowthPush.cpp

:
:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
                    $(LOCAL_PATH)/../../Classes/GrowthPush

# これもどっちでも良い。↓
# LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
# LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../Classes/GrowthPush

:
:

```

## AppActivity.java の編集
```AppActivity``` クラスは ```Cocos2dxActivity``` クラスを継承している。
これを ```GrowthPushCocos2dxActivity``` クラスを継承するようにする。

※GrowthPushのソースはあまり信用しない方が良い。
※ ```GPCocos2dxActivity``` という名前のクラスのバージョンのSDKもある…

```java:AppActivity.java
:
:

import com.growthpush.cocos2dx.GrowthPushCocos2dxActivity;

:

public class APpActivity extends GrowthPushCocos2dxActivity {
    :
    :
```

## AndroidManifest.xml の編集
cocosのプロジェクトの ```proj.android/AndroidManifest.xml``` に次のコードを追記する。
```YOUR_PACKAGE_NAME``` となっている部分は要変更。(ex. com.hashimotoryoh.growthpushtest)

```<application ... >...</application>``` タグ内に次を追記。

```xml:AndroidManifest.xml
<!-- GrowthPush -->
<activity
    android:name="com.growthpush.view.AlertActivity"
    android:configChanges="orientation|keyboardHidden"
    android:launchMode="singleInstance"
    android:theme="@android:style/Theme.Translucent" />
<receiver
    android:name="com.growthpush.BroadcastReceiver"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="YOUR_PACKAGE_NAME" />
    </intent-filter>
</receiver>
```

さらに ```<manifest ... >...</manifest>``` タグ内に次のパーミッションを追記。
ただし、既に書いてあるパーミッションは重複させる必要無し。

```xml:AndroidManifest.xml
<permission
    android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE" />
```

# ソースの記述
ここまででSDKの組み込みは終わったはず。

あとはデバイストークンをGrowthPushのサーバに登録するソースを書いて終わり。

## AppDelegate.cpp
```Classes/AppDelegate.cpp``` の ```bool AppDelegate::applicationDidFinishLaunching()``` メソッド内の任意の場所に次のを追記。

```c++:AppDelegate.cpp
#include "GrowthPush.h"
:
bool AppDelegate::applicationDidFinishLaunching()
{
    :

    // GrowthPushインスタンス初期化
#if COCOS2D_DEBUG
    GrowthPush::initialize((int)アプリケーションID,
                           "シークレットキー",
                           GPEnvironment::GPEnvironmentDevelopment,
                           true);
#else
    GrowthPush::initialize((int)アプリケーションID,
                           "シークレットキー",
                           GPEnvironment::GPEnvironmentProduction,
                           false);
#endif

    // GrowthPushサーバにデイバスを登録
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    GrowthPush::registerDeviceToken();
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    GrowthPush::registerDeviceToken("AndroidのセンダーID");
#endif

    :
    :
```

アプリケーションID : GrowthPushの管理画面、左カラムの[シークレットキー]から確認できる 4桁の数字
シークレットキー   : 同じところから確認できる 権限が"SDK権限"であると安心。自分で追加できる。
AndroidのセンダーID: Google API Sender ID


こんな感じ。