bekkou68 の日記

Gogengo! や IT 技術など。

Objective-C で Google Analytics SDK 3 をセットアップする手順

はじめに

Objective-CGoogle Analytics を使えるように GoogleAnalytics-iOS-SDK 3 を導入する例を書きます。ミニマムコードから共通化の例までご紹介します。公式のドキュメントはこちらです。

ミニマムコード編(2014年06月16日更新)

まずは動作させましょう。

Podfile にライブラリを追加します。Cocoapods の導入方法はこちら

+ pod 'GoogleAnalytics-iOS-SDK', '3.0.2'

インストールします。

$ pod install

[projectname]-Prefix.pch を編集します。Google Analytics ID は適宜指定してください。

#ifdef __OBJC__
    // google analytics
    #import "GAI.h"
    #import "GAIDictionaryBuilder.h"
    #import "GAIFields.h"
    ...
#endif

#define GOOGLE_ANALYTICS_ID @"UA-XXXXXX-X"
...

AppDelegate.h でライブラリを初期化します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    // initialization: Google Analytics
    GAI *gai = [GAI sharedInstance];
    gai.trackUncaughtExceptions = YES;
    gai.dispatchInterval = 5;
    [[gai logger] setLogLevel:kGAILogLevelError]; // ログレベルを変えることができる
    [gai trackerWithTrackingId:GOOGLE_ANALYTICS_ID];
    ...
}

計測したい ViewController を以下のように編集します。

- (void)viewDidAppear:(BOOL)animated
{
    // スクリーンビューを計測
    [[GAI sharedInstance].defaultTracker set:kGAIScreenName value:@"トップページ"];
    [[GAI sharedInstance].defaultTracker send:[[GAIDictionaryBuilder createAppView] build]];

    ...
}

- (void)hasPaid
{
    // イベントを計測
    //
    // 以下は各パラメタのメモ:
    // - Category: 分類しやすいように適宜指定(例: リソース名として"コメント"・"メッセージ" など)
    // - Action: ユーザが起こした行動(例: CRUDとして"作成"・"読込"など)
    // - Label: アクションの起こされた対象やパラメタなどの付加情報やサブカテゴリ等に使うとよさそう。必要なければ nil を指定
    // - Value: 管理画面から合計と平均を見られるので、そのような分析をしたい数値。たとえば課金額。必要なければ nil を指定
    [[GAI sharedInstance].defaultTracker send:[[GAIDictionaryBuilder createEventWithCategory:@"課金" action:@"広告非表示" label:@"クーポンコード使用" value:100] build]];
}

ここまで書いたら動作を確認しましょう。

それぞれが計測されていることはすぐに確認することができます。Google Analytics の管理画面の左メニューにある「リアルタイム>スクリーン, イベント」をご覧ください。

なお GAITrackedViewController を継承するともう少しラクにスクリーンを計測できるかもしれません(公式ドキュメント参照)。今回のエントリでは使っていません。

以上がミニマムコードとなります。次に共通化の例を 2つあげます。

通化編(例1)

導入

Rails の ApplicationController のように、ViewController の親クラスを定義します。すべての ViewController で継承しましょう。

なお、名前の衝突防止のためにクラス名は「プロジェクト専用のプリフィックス + ApplicationViewController」をつけるようにしています。例えばプロジェクト名が MyProject ならクラス名は MPApplicationViewController とします。

呼び出され側

MPApplicationViewController.h

#import <UIKit/UIKit.h>

@interface MPApplicationViewController : UIViewController

- (void)trackScreen:(NSString *)screenName;
- (void)trackEvent:(NSString *)category action:(NSString *)action label:(NSString *)label value:(NSNumber *)value;

@end

MPApplicationViewController.m

#import "MPApplicationViewController.h"

@interface MPApplicationViewController ()

@end

@implementation MPApplicationViewController

#pragma mark - Google Analytics

- (void)trackScreen:(NSString *)screenName
{
    [[GAI sharedInstance].defaultTracker set:kGAIScreenName value:screenName];
    [[GAI sharedInstance].defaultTracker send:[[GAIDictionaryBuilder createAppView] build]];
}

- (void)trackEvent:(NSString *)category action:(NSString *)action label:(NSString *)label value:(NSNumber *)value
{
    [[GAI sharedInstance].defaultTracker send:[[GAIDictionaryBuilder createEventWithCategory:category action:action label:label value:value] build]];
}

@end

共通する親クラスをつくっておくと色々とはかどります。例えば iOS7対応の ```self.edgesForExtendedLayout = UIRectEdgeNone;``` といったコードを viewDidLoad で一括指定できます。

呼び出し側

MPSampleViewController.h

#import "MPApplicationViewController.h"

@interface MPSampleViewController : MPApplicationViewController // 忘れずに継承

...

@end

MPSampleViewController.m

- (void)viewDidAppear:(BOOL)animated
{
    [self trackScreen:@"トップページ"];
}

- (void)hasPaid
{
    [self trackEvent:@"課金" action:@"広告非表示" label:nil value:100];
}

すっきりしました。共通化しておけば GAI のインターフェースが変わった時も変更箇所が少なくて済みます。

通化編(例2)

スクリーンを計測するメソッドをすべての ViewController で呼ぶのがめんどくさいかもしれません。そんな時の方法です。前提として、すべての ViewController で MPApplicationViewController を継承しているとします。

MPApplicationViewController.m

#import "MPTopViewController.h"
#import "MPSettingsViewController.h"

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    // ApplicationViewController を継承する全ViewController は Google Analytics の計測対象とする
    // スクリーン名はこちらで一元管理する
    // デフォルトで ViewController名をスクリーン名にセットしている
    NSDictionary *controllerScreenNameMappings = [self getControllerScreenNameMappings];
    NSString *className = NSStringFromClass(self.class);
    NSString *screenName = controllerScreenNameMappings[className];
      
    [[GAI sharedInstance].defaultTracker set:kGAIScreenName value:(screenName ? screenName : className)];
    [[GAI sharedInstance].defaultTracker send:[[GAIDictionaryBuilder createAppView] build]];
}

- (NSDictionary *)getControllerScreenNameMappings {
    NSDictionary *mappings = @{
        NSStringFromClass([MPTopViewController class]): @"トップ",
        NSStringFromClass([MPSettingsViewController class]): @"設定",
        ...
    };
    return mappings;
}

おわりに

以上となります。たのしい Google Analytics ライフをお過ごしください。