Google Analytics SDK を使ったスマホアプリのトラッキング

日付:
2012/8/24
カテゴリ:
Googleアナリティクス
ライター:
塚本和義

Google Analytics SDK を使うと Android アプリや iPhone アプリ上でのユーザーの行動が Google Analytics でトラッキングできます。
ここではその方法を簡単にご紹介します。

  1. 概要
  2. Androidアプリ
  3. iPhoneアプリ

概要

まず、Google Analytics を利用しますので Google Analytics のアカウントが必要です。
トラッキングを行いたいスマホアプリのWeb版が存在し、そちらでGoogle Analyticsを利用している場合は、そのGoogle Analyticsアカウントをそのまま使うのでも構いませんし、そうでない場合はGoogle Analyticsアカウントを作成します。
Google Analyticsアカウント作成の際、Google AnalyticsはWebサイト上でのトラッキングが前提となっているシステムですので、そのアプリに関連したWebサイトが存在しない場合でも適当なURLを指定する必要があります。
そのアプリに関連した Web サイトが存在しない場合は自社ドメインのサブドメインを切ったURLでも指定してください。(そのサブドメインが実在する必要はありません)

AndroidアプリとiPhoneアプリで若干の違いはありますが、必要なことや考え方はほぼ同じです。

  • シングルトンのトラッカーオブジェクトを取得し、そのオブジェクトのメソッドを呼び出して各種機能を使う。
  • 最初にUA-で始まるWebプロパティIDをトラッカーオブジェクトに設定する。
  • キャンペーン情報はsetReferrerで設定。
  • 画面遷移はtrackPageViewメソッドでトラッキング。
  • 各種操作はtrackEventメソッドでトラッキング。

trackPageViewメソッドで行う画面遷移のトラッキングについては元々Webページ遷移のトラッキングの機能である為、各種画面をWebページに見立ててURLを割り振り、そのURLを画面のIDとしてGoogle Analyticsのサーバーへ送信することになります。

例:

トップ画面 /top/
メニュー画面 /menu/
メイン画面 /main/
設定画面 /config/
アカウント設定画面 /config/account/
通信設定画面 /config/network/

※Excelのシートかなにかで管理しておくとよいでしょう。

ここでは解説しませんが、アプリ内課金のトラッキングも通常のECサイトでのga.jsを使った購入のトラッキングと同じようにトラッカーオブジェクトを使ってトラッキングできます。

キャンペーン情報は元々はWebサイトへの流入元を特定する為の情報ですが、スマホアプリではインストール経路を特定する情報として使われます。
また、キャンペーン情報は書き換えも可能ですので、課金の有無や、課金の度合いに応じて異なるキャンペーン情報を設定することで、ユーザーの課金カテゴリ別にトラッキングするなどといったこともできます。(※ただし個人を特定できるようなキャンペーン情報を設定してトラッキングを行ってはいけません)

それではAndroidアプリとiPhoneアプリでの具体的な利用方法を見ていきましょう。

Androidアプリ

[Google Analytics Android SDK Downloads - Google Analytics - Google Developers]

まずはGoogle Analytics SDK for Androidを上のリンク先からダウンロードし、その中に含まれるlibGoogleAnalytics.jarファイルをプロジェクトのlibsディレクトリ(無ければ作成)へ追加し、プロジェクトの[プロパティ]の[Javaのビルド・パス]から[Jar追加...]でlibsディレクトリに追加したlibGoogleAnalytics.jarファイルを追加します。

  1. Google Analytics SDK for Androidをダウンロード
  2. libGoogleAnalytics.jarをプロジェクトのlibsディレクトリへ追加
  3. プロジェクトの[プロパティ]にある[Javaのビルド・パス]から、[Jar追加...]でlibsディレクトリに追加したlibGoogleAnalytics.jarを追加

次に……

...
import com.google.android.apps.analytics.GoogleAnalyticsTracker;
...

public class TestActivity extends Activity {
  GoogleAnalyticsTracker tracker;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    tracker = GoogleAnalyticsTracker.getInstance();
    // Start the tracker in manual dispatch mode...
    tracker.startNewSession("UA-YOUR-ACCOUNT-HERE", this);

Google Analytics SDK for Androidより抜粋

……のようにアプリの起動シーケンス中でトラッカーオブジェクトを取得し、WebプロパティIDの設定を行えば後は自由にga.jsを使ったWebサイトのトラッキングと同様にtrackPageViewメソッドやtrackEventメソッドでトラッキングが行えます。

//  画面遷移のトラッキング
tracker.trackPageView("/top/");

//  操作のトラッキング
tracker.trackPageView
(
  "Menu",
  "Click",
  "Play",
  0,
);

また……

tracker.setReferrer("utm_campaign=test_campaign&utm_source=test_source&utm_medium=test_medium&utm_term=test_term&utm_content=test_content");

……のようにすることでキャンペーン情報を設定することもできます。
AndroidアプリではレシーバをAndroidManifest.xmlで指定しておけばアプリのインストールが行われた際にcom.android.vending.INSTALL_REFERRERインテントを受け取りインストールが行われるに至ったGoogle PlayのURLに付加されたキャンペーン情報を受け取ることができるのですが、自前で労することなく単にAndroidManifest.xmlに……

<!-- Used for install referrer tracking --> <receiver android:name="com.google.android.apps.analytics.AnalyticsReceiver" android:exported="true">
  <intent-filter>
    <action android:name="com.android.vending.INSTALL_REFERRER" />
  </intent-filter>
</receiver>

……のような記述を追加しておけばGoogle Analytics SDK for Androidがcom.android.vending.INSTALL_REFERRERインテントを受け取りトラッカーオブジェクトのsetReferrerメソッドを呼び出してキャンペーン情報を設定してくれます。

iPhoneアプリ

[Google Analytics SDK for iOS - Google Analytics - Google Developers]

まずはGoogle Analytics SDK for iOSを上のリンク先からダウンロードし、その中に含まれるGANTracker.hファイルとlibGoogleAnalytics.aファイルをプロジェクトのLibraryディレクトリへ追加します。
Google Analytics SDK for iOSはlibsqlite3.0.dylibとCFNetwork.frameworkに依存していますのでこれらもリンクされるように設定します。

  1. Google Analytics SDK for iOSをダウンロード
  2. GANTracker.hとlibGoogleAnalytics.aをプロジェクトのLibraryディレクトリへ追加
  3. libsqlite3.0.dylibとCFNetwork.frameworkもリンク

次に……

...
#import "BasicExampleAppDelegate.h"

#import "GANTracker.h"

// Dispatch period in seconds
static const NSInteger kGANDispatchPeriodSec = 10;

@implementation BasicExampleAppDelegate

@synthesize window = window_;

- (void)applicationDidFinishLaunching:(UIApplication *)application {
  // **************************************************************************
  // PLEASE REPLACE WITH YOUR ACCOUNT DETAILS.
  // **************************************************************************
  [[GANTracker sharedTracker] startTrackerWithAccountID:@"UA-0000000-1"
                                        dispatchPeriod:kGANDispatchPeriodSec
                                              delegate:nil];

Google Analytics SDK for iOSより抜粋

……のようにアプリの起動シーケンス中でトラッカーオブジェクトを取得し、WebプロパティIDの設定を行えば後は自由にga.jsを使ったWebサイトのトラッキングと同様にtrackPageViewメソッドやtrackEventメソッドでトラッキングが行えます。

NSError *error;

//  画面遷移のトラッキング
if (![[GANTracker sharedTracker] trackPageview:@"/top/"
                                     withError:&error]) {
  // Handle error here
}

//  操作のトラッキング
if (![[GANTracker sharedTracker] trackEvent:@"Menu"
                                     action:@"Click"
                                      label:@"Play"
                                      value:0
                                  withError:&error]) {
  // Handle error here
}

また…

[[GANTracker sharedTracker] setReferrer:@"utm_campaign=test_campaign&utm_source=test_source&utm_medium=test_medium&utm_term=test_term&utm_content=test_content" withError:&error];

……のようにすることでキャンペーン情報を設定することもできます。
ここで、Androidアプリであれば標準で提供されている仕組みを利用して簡単にインストールURLに含まれるキャンペーン情報を設定可能なのですが、iPhoneでは少々面倒な次のようなことをする必要がある上に実際にキャンペーン情報を取得できるかどうかは限定的です。

iPhoneアプリでのインストール時のキャンペーン情報取得

まず最初にこの仕掛けでトラッキング可能なのはiPhoneのSafariから誘導リンクがクリックされた場合に限ります。
そして誘導リンクのリンク先ではアクセス時のURLに含まれるパラメータ(キャンペーン情報)をSafariのクッキーに保存し、iTunesへリダイレクトします。その後、無事、ユーザーがiPhoneアプリをインストールし起動した際に、Safariからクッキー読み込み用ページにアクセスし、サーバー側でクッキーに格納されているキャンペーン情報を取得し、それをURLにパラメータとして付加した形でアプリへリダイレクトすることで、アプリがキャンペーン情報を受け取ることができるようになります。

【誘導リンク】::Webサーバー

誘導リンクですることはクッキーへの保存とiTunesへのリダイレクトだけです。
キャンペーン情報となるパラメータだけクッキーに保存するのもいいですし、より踏み行った情報収集を行う為にリファラなどもクッキーに保存しておくのもいいでしょう。
クッキーへ必要な情報を格納すれば後はiTunesのアプリページへリダイレクトするだけです。

【初回起動】::iPhoneアプリ

ユーザーが無事アプリをインストールし起動してくれたら次のようなコードで初回起動の判断後、Safariでクッキー読み込み用ページにアクセスします。

NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
[defaults setObject:@"YES" forKey:@"myapp_install_first_time"];
[ud registerDefaults:defaults];
if ([ud boolForKey:@"myapp_install_first_time"]) {
  [ud setBool:NO forKey:@"myapp_install_first_time"];
  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"【クッキー読み込み用ページURL】"]];
}

……ネットへのアクセスが前提のアプリであれば問題になることは少ないでしょうが、特にそうでないアプリの場合、ネットに接続できない状況下で初回起動が行われるとSafariがアクティブになったまま自動ではアプリに戻ってきませんので注意が必要です。

SCNetworkReachabilityGetFlags()関数を使えばネットへの接続状態をチェック可能ですが、WiFiは繋がっているがその先でインターネットには繋がっていないという状況ではタイムアウトになるまで処理が戻ってこないといった問題があり、よりしっかりとした実装にするには非同期に処理を行いインターネットに接続できることが確認できた時点でSafariを呼び出すようにする必要があります。

【クッキー読み込み用ページ】::Webサーバー

クッキー読み込み用ページではクッキーに保存されている内容を取得し、URLパラメータとして付加した状態でiPhoneアプリ固有のカスタムURLスキームへリダイレクトでアプリに戻します。
その際に誘導リンクでクッキーに保存しておいたリファラ情報などをWebサーバー上のログファイルに記録して実際にインストールが実施されたリンク元情報として集計するのもよいでしょう。

【カスタムURLスキームの設定】::iPhoneアプリ

カスタムURLスキームを設定していない場合、XCodeでプロジェクトのplistを開いて、適切にカスタムURLスキームを設定してください。

カスタムURLスキームは今回のような仕掛けを使わない場合でも設定しておくと他のアプリやリンクからそのアプリが起動できるようになりますので、是非とも設定しておきましょう。

【キャンペーン情報の取得・設定】::iPhoneアプリ

カスタムURLスキームによってアプリが起動された場合、application:handleOpenURLメソッドでそのURLを受け取れますので、そのURLを調べてキャンペーン情報を取得し、トラッカーオブジェクトに設定します。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
{
  NSError *error = nil;
  NSString * query = [url query];
  NSArray * url_params = [query componentsSeparatedByString:@"&"];
  for(id i_param in url_params) {
    NSArray * name_value = [i_param componentsSeparatedByString:@"="];
    if (2 <= [name_value count]) {
      NSString * name = [name_value objectAtIndex:0];
      if ([name isEqualToString:@"referrer"]) {
        NSString * value = [name_value objectAtIndex:1];
        NSString * decoded_value = (NSString *) CFURLCreateStringByReplacingPercentEscapesUsingEncoding
        (
          kCFAllocatorDefault,
          (CFStringRef)value,
          CFSTR(""),
          kCFStringEncodingUTF8
        );
        [[GANTracker sharedTracker] setReferrer:decoded_value withError:&error];
        break;
      }
    }
  }

  return [super application:application handleOpenURL:url];
}