スマホアプリのGoogle Analytics計測でネイティブ部分とウェブビューを同じプロパティIDで計測する方法

日付:
2013/6/26
カテゴリ:
Googleアナリティクス
ライター:
塚本和義

通常のGoogle Analytics SDKを使ったスマホアプリのトラッキング方法を紹介してきましたが、今回はアプリ内のWebViewと同一セッションで連携する方法について触れます。

  1. WebViewの危険性について
  2. 画面遷移のトラッキング
  3. DHTMLやイベントのトラッキング

WebViewの危険性について

先当たってWebViewを使うことについての注意事項なのですが、WebViewまわりはセキュリティホールになり易いので慎重になる必要があります。

特に今回のようにネイティブ側への通知を含む形になる場合はWebViewで表示するコンテンツは安全なコンテンツと言えるhttpsでアクセスできる自前で用意したサイトかアプリに内蔵させたHTMLファイルのみに絞ってください。

ここではセキュリティに関することは主眼ではないので、具体的なWebViewまわりのセキュリティ上の問題については他のサイトに譲りますが、WebViewを使う以上は避けて通れない問題ですので、一通りWebViewまわりのセキュリティについて別途情報を押さえておいてください。

画面遷移のトラッキング

AndroidにしてもiPhoneにしてもWebView上で表示してるURLが変わるところで処理をフックできますので、あとはそのURLをGoogle Analytics SDKを使って送信してやるだけで実現できます。

Android

webview.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        URI uri = new URI(url);
        String path = uri.getPath(); // GA上でモニターし易いように必要応じて整形
        tracker.trackView(path);
        return false;
    }
});

iPhone

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *url = [request URL]; // GA上でモニターし易いように必要応じて整形
    [tracker sendView:[url path]];

    return [ super webView:webView shouldStartLoadWithRequest:request navigationType:navigationType ];
}

通常trackView / sendViewではリアルタイムに情報は送信されずtracker側でプールされディスパッチの設定にもとづいたタイミングで送信されます。

DHTMLやイベントのトラッキング

DHTMLでURLは変わらないが実際の表示してる画面内容が変わる作りになっている場合や、画面遷移以外のなんらかのイベントをトラッキングしたい場合は明示的にダミーのURLへ遷移しようとすることによってネイティブ側へ通知します。ここで使われるダミーのURLはフックする処理で判別できればURLの書式にさえ適合していればなんでもいいですのが、一般的には……

[独自のプロトコル名]://[JavaScript側からネイティブ側に送る情報]

……のような形で例えばtracking://screen/toptracking://event/click?object=submit_button&screen=postのような感じでJavaScript側からネイティブ側に送りたい情報をURLに含め、先頭の独自のプロトコル名によってフックの処理でネイティブ側への情報送信だと判別します。

JavaScript

var path = "tracking://" + ...; // JavaScript側からネイティブ側に送る情報を URL の形に整形
document.location = path;

Android

webview.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("tracking:")) {
            String screen = ...; // url から GA へ送る情報の取得&整形
            tracker.trackView(screen);
            return true;
        }
        return false;
    }
});

iPhone

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *url = [request URL];
    if ([[url scheme] isEqualToString:@"tracking"]) {
        NSString * screen = ...; // url から GA へ送る情報の取得&整形
        [tracker sendView:screen];

        return NO;
    }
    return [ super webView:webView shouldStartLoadWithRequest:request navigationType:navigationType ];
}

shouldOverrideUrlLoading / shouldStartLoadWithRequestではそれぞれtrue / noを返すことで実際にそのURLへ画面遷移しようとしてしまうことを防げます。