Growthbeat SDKでCocos2d-xプロジェクトにPush通知を実装する

# はじめに
スマホアプリとして、質の高いサービスを配信/運用するには「PUSH通知」で、多くのユーザーにイベント告知など情報を共有する機能が必要になります。

多くのゲームアプリでも実装されている「PUSH通知」ですが、2021年4月、Apple社は従来のAPNs通信インターフェイスのサポートを終了する事になりました。サポート終了に伴い、できる限り早い時期に開発と本番環境をHTTP/2に対応する必要がありました。

https://developer.apple.com/news/?id=7gx0a2lp

> Apple Push Notification service server certificate update
February 10, 2021

> On March 29, 2021, token and certificate-based HTTP/2 connections to the Apple Push Notification service must incorporate the new root certificate (AAACertificateServices 5/12/2020) which replaces the old GeoTrust Global CA root certificate. To ensure a seamless transition and to avoid push notification delivery failures, verify that both the old and new root certificates for the HTTP/2 interface are included in the Trust Store of each of your notification servers before March 29.

> Note that Apple Push Notification service SSL provider certificates issued to you by Apple do not need be to updated at this time.

「PUSH通知」の実装は下の図の様になっていましたが、運用の効率化と保守の負担を無くす為、Growth Pushの実装に切り替えました。
![1415edc2-0262-4180-a678-7ffce5599358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/fd7b70f2-6ca0-8558-2467-f977cb16f3a1.png)
Growth Pushの実装について備忘録としてまとめます。

## Growth Pushとは？

アプリ開発者のためのPush通知解析・配信サービスです。
Push通知のセグメント配信や・ユーザーの行動を解析して
継続率を高めていくことが可能です。

https://growthbeat.com/

# 実装手順
## 1. SDK導入
GitHubからSDKをcloneし、submoduleをupdateします。

```
git clone https://github.com/SIROK/growthbeat-cocos2dx.git
cd ./growthbeat-cocos2dx
git submodule update --init --recursive
```

source/Classes ディレクトリの中身、Grothbeat, GrowthPush, GrowthLink 3つのフォルダーを、自分のプロジェクトのClasses配下の適切な場所にコピーします。

https://github.com/growthbeat/growthbeat-cocos2dx

### iOSの初期設定
Xcodeにて、Classesにコピーしたフォルダを、インポートします。Create groupsにチェックし、ターゲットを任意のビルドスキームにチェックします。growthbeat-ios/Growthbeat.framework をコピーして、自分のプロジェクトのproj.ios/Frameworks/ 配下に配置します。
Growthbeat.frameworkは、下のFrameworkが必須なので、Xcodeプロジェクトに依存するFrameworkを追加します。

* Foundation.framework
* UIKit.framework
* CoreGraphics.framework
* Security.framework
* SystemConfiguration.framework
* AdSupport.framework
* CFNetwork.framework

### Androidの初期設定
source/proj.android/src の中身を、自分のプロジェクトのproj.android/src配下に配置します。

#### Android Studio導入方法
build.gradleに下記の設定を追加します。

```
dependencies {
    // Androidのライブラリです。growthbeatのライブラリの機能に依存します。
    compile "com.android.support:appcompat-v7:23.3.0"
    compile 'com.google.android.gms:play-services-gcm:9.2.1'
    compile 'com.google.android.gms:play-services-ads:9.2.1'

    // Growthbeat SDK Android
    compile 'com.growthbeat:growthbeat-android:2.0.5@aar'
}
```

Growthbeat SDKを利用するには、依存ライブラリが必要となります。

* appcompat-v7もしくはandroid-support-v4
* google-play-services-gcm
* google-play-services-ads

#### ソースビルド設定
Android.mk に下記を追加してください。

```
LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp \
                   ../../Classes/Growthbeat/GrowthbeatInstance.cpp \
                   ../../Classes/Growthbeat/android/Growthbeat.cpp \
                   ../../Classes/GrowthPush/GrowthPushInstance.cpp \
                   ../../Classes/GrowthPush/android/GrowthPush.cpp \
                   ../../Classes/GrowthLink/GrowthLinkInstance.cpp \
                   ../../Classes/GrowthLink/android/GrowthLink.cpp \

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
                    $(LOCAL_PATH)/../../Classes/Growthbeat/ \
                    $(LOCAL_PATH)/../../Classes/Growthbeat/android \
                    $(LOCAL_PATH)/../../Classes/GrowthPush/ \
                    $(LOCAL_PATH)/../../Classes/GrowthPush/android \
                    $(LOCAL_PATH)/../../Classes/GrowthLink/ \
                    $(LOCAL_PATH)/../../Classes/GrowthLink/android \
```

#### AndroidManifest.xmlの設定
レジストレーションIDを取得するため、またプッシュ通知を受信するためにAndroidManifest.xmlに必要なクラスを記述します。

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

<application>
    <!-- ... -->

    <activity
        android:name="com.growthpush.view.AlertActivity"
        android:configChanges="orientation|keyboardHidden"
        android:launchMode="singleInstance"
        android:theme="@android:style/Theme.Translucent" />
    <service
        android:name="com.growthpush.TokenRefreshService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.gms.iid.InstanceID"/>
        </intent-filter>
    </service>
    <service android:name="com.growthpush.RegistrationIntentService"/>
    <service
        android:name="com.growthpush.ReceiverService"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>
    <receiver
        android:name="com.google.android.gms.gcm.GcmReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="YOUR_PACKAGE_NAME" />
        </intent-filter>
    </receiver>

</application>
```

#### GrowthbeatCocos2dx の使用

##### c++ファイルの実装
AppDelegate.cpp に以下のコードを追加します。

1. AppDelegate.cpp に以下のコードを追加します。

```
#include "Growthbeat.h"
#include "GrowthPush.h"

USING_NS_GROWTHBEAT;
USING_NS_GROWTHPUSH;

#ifdef COCOS2D_DEBUG
GPEnvironment kGPEnvironment = GPEnvironmentDevelopment;
#else
GPEnvironment kGPEnvironment = GPEnvironmentProduction;
#endif

AppDelegate::AppDelegate() {    
}

AppDelegate::~AppDelegate(){
}

bool AppDelegate::applicationDidFinishLaunching() {
    GrowthPush::getInstance()->initialize("YOUR_APPLICATION_ID", "YOUR_CREDENTIAL_ID", kGPEnvironment);
    GrowthPush::getInstance()->requestDeviceToken("YOUR_SENDER_ID");
}

bool AppDelegate::applicationWillEnterForeground() {
    Growthbeat::getInstance()->start();
}

bool AppDelegate::applicationDidEnterBackground() {
    Growthbeat::getInstance()->stop();
}
```

##### タグ送信
セグメントを設定するために、任意のタグを埋め込んでください。

```
bool AppDelegate::applicationDidFinishLaunching() {
    GrowthPush::getInstance()->setTag("Development", "true");
}
```

##### イベント送信
セグメントを設定するために、任意のイベントを埋め込んでください。

```
bool AppDelegate::applicationDidFinishLaunching() {
    GrowthPush::getInstance()->trackEvent("Launch");
}
```

##### プッシュ通知ペイロードの受け取り
プッシュ通知送信時に、カスタムフィールドのjson値を受け取ることができます。

```
GrowthPush::getInstance()->setOpenNotificationCallback([](cocos2d::Value extra)->void{
    CCLOG("%s", extra.getDescription().c_str());
});
```

## 参考サイト
* [サポートページ](http://support.growthbeat.com/)
* [growthbeat/growthbeat-cocos2dx](https://libraries.io/github/growthbeat/growthbeat-cocos2dx)