通常のGoogle Analytics SDKを使ったスマホアプリのトラッキング方法を紹介してきましたが、今回はアプリ内のWebViewと同一セッションで連携する方法について触れます。
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/top
やtracking://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へ画面遷移しようとしてしまうことを防げます。