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


はじめに

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

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

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の実装に切り替えました。

Growth Pushの実装について備忘録としてまとめます。

Growth Pushとは?

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

実装手順

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配下の適切な場所にコピーします。

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());
});

参考サイト