cocos2d-xでGoogle Analytics(iOS v3, Android v4)を入れる

Google Analyticsをcocos2d-xのアプリに入れました。cocos2dxのバージョンはv3.0,Google Analyticsは現時点で最新のiOS v3.09, Android v4です。

iOS, Android共通設定

基本は、Googleの公式ページの方法で実装しました。
Google Analytics SDK for iOS v3 – Getting Started
Google Analytics SDK v4 for Android – Getting Started
cocos2dxでのネイティブ連携についてなどは、こちらを参考にしました。
Cocos2d-xプロジェクトにGoogleAnalyticsを入れる(iOS)
【cocos2dx】Jniを利用してJavaのコードを呼び出す

今回はGAを使ってスクリーンを各OSから送信させるようにしました。イベントは今回は特に必要なかったので実装していません。
最初にGAを入れるアプリ用のプロパティIDはアナリティクス設定から追加しておきます。
まずGoogleAnalyticsをcocosから呼び出すための共通メソッドを定義するヘッダーファイルを作成します。

GoogleAnalyticsTracker.h

#ifndef DartsScore_GoogleAnalyticsTracker_h
#define DartsScore_GoogleAnalyticsTracker_h

#include "cocos2d.h"

class GoogleAnalyticsTracker
{
public:
    
    /**GoogleAnalyticsへのデータ送信処理を初期化します。*/
    static void setup();
    
    /**
     GoogleAnalyticsにスクリーントラッキング情報を送信します。
     
     @param screenName スクリーン名。
     */
    static void sendScreen(const char* screenName);
};

#endif

cocos2d側ではこのsendScreenを各Scene, LayerのonEnterで使えばスクリーンが送信されます。

void DartsSelectScene::onEnter() {
    Layer::onEnter();
    GoogleAnalyticsTracker::sendScreen("DartsSelectScene");
}

iOSでGoogle Analyticsを使えるようにする

1. iOS SDKダウンロード

Downloads – iOS SDK
現時点のバージョンはv3.09です。

2. SDKをプロジェクトに追加

ダウンロードしてきたSDKを解凍したらそのままのフォルダ構成で、以下のファイルだけ残して、プロジェクトのiosフォルダに追加します。

3. フレームワーク追加

以下のフレームワークをプロジェクトに追加しておきます。

  • CoreData.framework
  • SystemConfiguration.framework
  • libz.dylib
  • libGoogleAnalyticsServices.a

4. ファイル追加

iOSでGAのapiを使うファイルを追加します。ほぼ全部公式サイトのコピペです。

GoogleAnalyticsTracker.mm

#import "GoogleAnalyticsTracker.h"
#import "GAI.h"
#import "GAIDictionaryBuilder.h"
#import "GAIFields.h"

#define GA_TRACKING_ID "UA-XXXX-Y"

void GoogleAnalyticsTracker::setup()
{
    // Optional: automatically send uncaught exceptions to Google Analytics.
    [GAI sharedInstance].trackUncaughtExceptions = YES;
    
    // Optional: set Google Analytics dispatch interval to e.g. 20 seconds.
    [GAI sharedInstance].dispatchInterval = 20;
    
    // Optional: set Logger to VERBOSE for debug information.
    [[[GAI sharedInstance] logger] setLogLevel:kGAILogLevelVerbose];
    
    // Initialize tracker. Replace with your tracking ID.
    [[GAI sharedInstance] trackerWithTrackingId:[NSString stringWithUTF8String:GA_TRACKING_ID]];
}

void GoogleAnalyticsTracker::sendScreen(const char* screenName)
{
    // May return nil if a tracker has not already been initialized with a
    // property ID.
    id tracker = [[GAI sharedInstance] defaultTracker];
    
    // This screen name value will remain set on the tracker and sent with
    // hits until it is set to a new value or to nil.
    [tracker set:kGAIScreenName value:[NSString stringWithUTF8String:screenName]];
    
    [tracker send:[[GAIDictionaryBuilder createScreenView] build]];
}

AppController.mmにも1行追加します。

AppController.mm

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //・・・・・・・
        
    // GA setup
    GoogleAnalyticsTracker::setup();

    return YES;
}

iOSは以上でスクリーン送信されるようになったはずです。

AndroidでGoogle Analyticsを使えるようにする

1. Android SDK Packageを追加

Android SDK Managerで以下のパッケージを追加しておきます。

    Tools
  • Android SDK Tools
  • Android SDK Platform-tools
  • Android SDK Build-tools
    Extras
  • Android Support Repository
  • Android Support Library
  • Google Repository
  • Google Play services

2. Google Play Servicesをプロジェクトに追加

以下Eclipseの例で手動でGooglePlayServicesライブラリを追加します。Android Studioの方が簡単です。

2.1 ライブラリをcocos2dxプロジェクトにコピー

cp -r /path/to/android-sdk/extras/google/google_play_services/libproject/google-play-services_lib /path/to/project/proj.android/libs

2.2 ライブラリをEclipseにインポート

Eclipse上で先ほど追加したgoogle playのライブラリをインポートした後、プロジェクトのプロパティ > Androidの設定でも追加しておきます。

2.3 AndroidManifest.xmlに追加

以下をAndroidManifest.xmlの<application>の下に追加します。

<meta-data android:name="com.google.android.gms.version"
           android:value="@integer/google_play_services_version" />

3. AndroidManifest.xmlに追加

またAndroidManifest.xmlに以下を追加します。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

4. ファイル追加

AndroidでGAのapiを使うファイルを追加します。JNIです。iOSに比べてAndroidは結構大変です。

GoogleAnalyticsTracker.cpp

#include "GoogleAnalyticsTracker.h"
#include "GoogleAnalyticsTracker_JNI.h"

void GoogleAnalyticsTracker::sendScreen(const char* screenName)
{
    sendScreenJNI(screenName);
}

GoogleAnalyticsTracker_JNI.h

#ifndef DartsScore_GoogleAnalyticsTracker_JNI_h
#define DartsScore_GoogleAnalyticsTracker_JNI_h

extern void sendScreenJNI(const char* screenName);

#endif

GoogleAnalyticsTracker_JNI.cpp

#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include "GoogleAnalyticsTracker_JNI.h"

#define CLASS_NAME "org/cocos2dx/cpp/AppActivity"

void sendScreenJNI(const char* screenName) {
    cocos2d::JniMethodInfo t;
    if (cocos2d::JniHelper::getStaticMethodInfo(t, CLASS_NAME, "sendScreen", "(Ljava/lang/String;)V")) {
        jstring jScreenName = t.env->NewStringUTF(screenName);
        t.env->CallStaticVoidMethod(t.classID, t.methodID, jScreenName);
        
        t.env->DeleteLocalRef(jScreenName);
        t.env->DeleteLocalRef(t.classID);
    }
}

JNIの部分はややこしいですがどこもこのパターンで使われています。このままだとXcodeでエラーになるので、今追加した2つのcppファイルはXcodeのターゲットからは外しておきます。

さらにJavaのApplicationファイルを追加します。ここも公式で推薦している方法を採用していますが、getTrackerの部分だけ、簡単にしています。

AnalyticsApplication.java

package org.cocos2dx.cpp;

import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.Tracker;
import com.your.app.R;

import android.app.Application;

public class AnalyticsApplication extends Application {
    Tracker mTracker;

    synchronized Tracker getTracker() {
        if (mTracker == null) {
            GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
            mTracker = analytics.newTracker(R.xml.ga_tracker);
        }
        return mTracker;
    }
}

AppActivity.javaに以下を追加します。

AppActivity.java

public static void sendScreen(String screenName) {
    // Get tracker.
    Tracker t = ((AnalyticsApplication) Cocos2dxActivity.getContext().getApplicationContext()).getTracker();

    // Set screen name.
    // Where path is a String representing the screen name.
    t.setScreenName(screenName);

    // Send a screen view.
    t.send(new HitBuilders.AppViewBuilder().build());
}

AndroidManifest.xmlのapplication部分にandroid:nameを追加します。

AndroidManifest.xml

<application android:name="org.cocos2dx.cpp.AnalyticsApplication"
             android:label="@string/app_name"
             android:icon="@drawable/icon">

ga_tracker.xmlをプロジェクトのres/xmlフォルダ内に追加します。ここにプロパティIDを入力します。

ga_tracker.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <integer name="ga_sessionTimeout">300</integer>

    <!-- Enable automatic Activity measurement -->
    <bool name="ga_autoActivityTracking">true</bool>

    <!--  The following value should be replaced with correct property id. -->
    <string name="ga_trackingId">UA-XXXXXXX-Y</string>
</resources>

これでAndroidでもGAを使えるようになりました。

リアルタイムビューで送信されているか確認。iOSとAndroidもしっかり送信されています。Androidは反映が遅いような?

Androidの部分が、proj.android内にファイルを作ったり編集したりたくさんしているので、なんとかしてプラグイン化できたらよさそうだなと思ってます。