Cocos2d-xプロジェクトにGoogleAnalyticsを入れる(iOS)

GoogleAnalytics(v3)をCocos2d-x(3.0beta)上で使用する方法について、初めて対応したので、備忘録として手順をまとめてみました。
※今回はiOSのみの対応です。

## GoogleAnalyticsのSDKをダウンロード
[GoogleAnalytics](http://www.google.co.jp/intl/ja/analytics/)

GoogleAnalyticsのアカウントを持っていない場合は、まずアカウントを作成しましょう。
アカウント作成の段階では、「トラッキングの対象」を「モバイルアプリ」にしておくくらいで、他に注意する点はありません。

![GoogleAnalytics](https://qiita-image-store.s3.amazonaws.com/0/7345/60782ee5-257a-51c8-be3a-2febd61ab41d.png)

管理するアプリを追加して、アプリの管理ページに移動したら、「Google Analytics iOS SDK」からiOS用のSDKをダウンロードします。
あと、「トラッキングID」をあとで使うので控えておきましょう。

## 必要なファイルをCocos2d-xプロジェクトへ追加
ダウンロードしたSDKを解凍して、必要なファイルをコピーします。

* libGoogleAnalyticsServices.a
* GoogleAnalytics/Library/GAI.h
* GoogleAnalytics/Library/GAIDictionaryBuilder.h
* GoogleAnalytics/Library/GAIFields.h
* GoogleAnalytics/Library/GAILogger.h
* GoogleAnalytics/Library/GAITrackedViewController.h
* GoogleAnalytics/Library/GAITracker.h

あと、以下のライブラリが必要となるので、追加しておきます。

* CoreData.framework
* SystemConfiguration.framework

プロジェクトの準備はこれで完了です。

## GoogleAnalyticsを初期化する
Cocos2d-xからネイティブの機能（Objective-C）にアクセスする必要があります。
ここではアクセスを簡易化するため、GoogleAnalyticsを操作するユーティリティクラスを作成します。

```cpp:GoogleAnalyticsTracker.h
class GoogleAnalyticsTracker
{ 
public:
    
    /**GoogleAnalyticsへのデータ送信処理を初期化します。*/
    static void setup();
    
    /**
     GoogleAnalyticsにスクリーントラッキング情報を送信します。
     
     @param screenName スクリーン名。
     */
    static void sendAppView(const char* screenName);
    
    /**
     GoogleAnalyticsにイベントトラッキング情報を送信します。
     
     @param category イベントカテゴリ。
     @param action イベントアクション。
     @param label イベントラベル。
     @param value
     */
    static void sendEvent(const char* category,
                          const char* action,
                          const char* label,
                          int value);
};
```

まずはGoogleAnalytics初期化用のメソッドを作成します。

```objc++:GoogleAnalyticsTracker.mm
// アプリのトラッキングIDを入れてください。
#define GA_TRACKING_ID     ( "XXXXXXXXXXXXX" )

void GoogleAnalyticsTracker::setup()
{
    // GoogleAnalyticsを設定します。
    GAI* gai = [GAI sharedInstance];
    gai.trackUncaughtExceptions     = YES; // キャッチ不可な例外を自動送信します。
    gai.dispatchInterval            = 120; // 送信の時間間隔です。120秒。
    [[gai logger] setLogLevel:kGAILogLevelVerbose]; // ログのレベルを設定。
    [gai trackerWithTrackingId:[NSString stringWithUTF8String:GA_TRACKING_ID]]; // トラッキングIDを設定します。
}
```

これを、UIApplicationDelegateを実装しているAppControllerから呼び出してあげます。

```objc++:AppController.mm

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    
    // Override point for customization after application launch.

    // Setup GoogleAnalytics
    GoogleAnalyticsTracker::setup();
    
    // Add the view controller's view to the window and display.
    
    ...
    
}
```

## GoogleAnalyticsをCocos2d-xから使用する
ここからは実際にトラッキングしていきます。
まずは、どの画面に移動したのかを計測するためのスクリーンのトラッキングです。

```objc++:GoogleAnalytics.mm
void GoogleAnalyticsTracker::sendScreen(const char* screenName)
{
    GAI* gai = [GAI sharedInstance];
    
    // スクリーン名をパラメータに設定します。
    [gai.defaultTracker set:kGAIScreenName value:[NSString stringWithUTF8String:screenName]];
    
    NSMutableDictionary* appViewDict = [[GAIDictionaryBuilder createAppView] build];
    [gai.defaultTracker send:appViewDict];
}
```

Coco2d-x側では、各SceneのonEnterに入れるといい感じになるみたいです。

```cpp:TitleScene.cpp

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

```

![ScreenTracking](https://qiita-image-store.s3.amazonaws.com/0/7345/7797f38e-1911-318f-3391-d4e881c8d1d9.png)

こんな感じで送信されます。
ゲーム中どこの画面に多く遷移しているのかを計測する時に便利ですね。

続いては、ユーザーがどんなアクションを起こしているかを見るためのイベントのトラッキングです。

```objc++:GoogleAnalytics.mm
void GoogleAnalyticsTracker::sendEvent(const char* category,
                                       const char* action,
                                       const char* label,
                                       int value)
{
    NSMutableDictionary* eventDict = [[GAIDictionaryBuilder createEventWithCategory:[NSString stringWithUTF8String:category]
                                                                             action:[NSString stringWithUTF8String:action]
                                                                              label:[NSString stringWithUTF8String:label]
                                                                              value:[NSNumber numberWithInt:value]] build];
    GAI* gai = [GAI sharedInstance];
    [gai.defaultTracker send:eventDict];
}
```

例えばボタンアクションとかに設定して、どのボタンが押されているかをチェックできます。

```cpp:TitleScene.cpp
void Title::buttonTapped(MenuItem* button)
{
    GoogleAnalyticsTracker::sendEvent("UI", "Button", "Test", 0);
}
```

GoogleAnalytics上で見るとこんな感じになります。
![EventTracking](https://qiita-image-store.s3.amazonaws.com/0/7345/777c33ac-f41f-bca9-ba87-5af1f94a6578.png)

あとは、これらの送信用のメソッドを必要な場所に差し込んでいきましょう。
以上です。