こんにちは。iOSエンジニアのキムです。
モバイルアプリの場合、無料のトラッキングツールでFirebase Analyticsがよく使われますが、今回はWebViewからFirebase Analyticsへイベントを送る方法について調べてみたいと思います。 Firebase AnalyticsのSDKは、WebViewページからのイベントの送信をサポートしていませんので、WebViewでAnalyticsを使用するには、WebView側からネイティブコード側へイベントを転送する必要があります。
それでは実際にやってみます。
JavaScript ハンドラを実装する
WebView側ではまず、JavaScript関数を作成してネイティブコード側へ転送する必要があります。 次の例は、Firebaseのドキュメントにあるサンプルコードです。
WebView でアナリティクスを使用する | Firebase Documentation
function logEvent(name, params) {
if (!name) {
return;
}
if (window.AnalyticsWebInterface) {
// Call Android interface
window.AnalyticsWebInterface.logEvent(name, JSON.stringify(params));
} else if (window.webkit
&& window.webkit.messageHandlers
&& window.webkit.messageHandlers.firebase) {
// Call iOS interface
var message = {
command: 'logEvent',
name: name,
parameters: params
};
window.webkit.messageHandlers.firebase.postMessage(message);
} else {
// No Android or iOS interface found
console.log("No native APIs found.");
}
}
function setUserProperty(name, value) {
if (!name || !value) {
return;
}
if (window.AnalyticsWebInterface) {
// Call Android interface
window.AnalyticsWebInterface.setUserProperty(name, value);
} else if (window.webkit
&& window.webkit.messageHandlers
&& window.webkit.messageHandlers.firebase) {
// Call iOS interface
var message = {
command: 'setUserProperty',
name: name,
value: value
};
window.webkit.messageHandlers.firebase.postMessage(message);
} else {
// No Android or iOS interface found
console.log("No native APIs found.");
}
}
ネイティブコードでWebViewからイベントを受信する
次に、iOSのネイティブコード側では、WebView側から転送されたイベントを収集し、FirebaseSDKに渡す必要があります。
まずは、メッセージハンドラをWebViewのユーザーコンテンツコントローラに追加します。
override func loadView() { super.loadView() self.webView.configuration.userContentController.add(self, name: "firebase") }
そして、WKScriptMessageHandlerプロトコルに準拠したメッセージハンドラークラスを作成します。userContentController:didReceiveScriptMessage:コールバック内でWebView側から転送されたイベントの詳細が取得できます。
extension WebViewController: WKScriptMessageHandler { func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { guard let body = message.body as? [String: Any] else { return } guard let command = body["command"] as? String else { return } guard let name = body["name"] as? String else { return } if command == "logEvent" { guard let params = body["parameters"] as? [String: NSObject] else { return } Analytics.logEvent(name, parameters: params) } } }
これでmessageの中からcommandやnameの情報が取得できます。そして、取得したイベント情報をFirebaseSDKへ渡しせば完了です。
最後に
これでWebViewを利用する場合でもFirebase Analyticsでイベントトラッキングができるようになりました。 イベントトラッキングを仕込んでユーザーの行動を追跡し、分析することでユーザーへの理解を深めることができ、次の改善へ繋げることができます。是非活用してみましょう!
一緒に楽しく働くiOSエンジニアも募集中です!