הטמעת handler של JavaScript
השלב הראשון בשימוש ב-Google Analytics ב-WebView הוא ליצור פונקציות JavaScript כדי להעביר אירועים ומאפייני משתמשים לקוד Native. בדוגמה הבאה אפשר לראות איך לעשות את זה באופן שתואם גם לקוד Native של Android וגם לקוד Native של Apple: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."); } }
מפעילים את ה-JavaScript handler מ-WebView
כדי לתעד אירועים ולהגדיר מאפייני משתמשים בצורה תקינה מתוך WebView, צריך להפעיל את פונקציות ה-JavaScript שהגדרתם בשלב הקודם. בדוגמה הבאה אפשר לראות איך לתעד אירוע רכישה בצורה נכונה ולהגדיר מאפיין משתמש:function logEventExample() { // Log an event named "purchase" with parameters logEvent("purchase", { content_type: "product", value: 123, currency: "USD", quantity: 2, items: [{ item_id: "sample-item-id", item_variant: "232323" }], transaction_id: "1234567" }); } function logUserPropertyExample() { // Set a user property named 'favorite_genre' setUserProperty("favorite_genre", "comedy") }
הטמעת ממשק מותאם
אפשר להטמיע ממשק מקורי ל-iOS או ל-Android.
iOS
כדי להפעיל קוד מקורי של Apple מ-JavaScript, צריך ליצור מחלקה של גורם handler להודעות שתואמת לפרוטוקול WKScriptMessageHandler. אפשר לבצע קריאות ל-Google Analytics בתוך פונקציית ה-callback של userContentController:didReceiveScriptMessage::
Swift
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 == "setUserProperty" { guard let value = body["value"] as? String else { return } Analytics.setUserProperty(value, forName: name) } else if command == "logEvent" { guard let params = body["parameters"] as? [String: NSObject] else { return } Analytics.logEvent(name, parameters: params) } }
Objective-C
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { if ([message.body[@"command"] isEqual:@"setUserProperty"]) { [FIRAnalytics setUserPropertyString:message.body[@"value"] forName:message.body[@"name"]]; } else if ([message.body[@"command"] isEqual: @"logEvent"]) { [FIRAnalytics logEventWithName:message.body[@"name"] parameters:message.body[@"parameters"]]; } }
לבסוף, מוסיפים את ה-message handler לבקר תוכן המשתמש של ה-WebView:
Swift
self.webView.configuration.userContentController.add(self, name: "firebase")
Objective-C
[self.webView.configuration.userContentController addScriptMessageHandler:self name:@"firebase"];
Android
כדי להפעיל קוד Android מקורי מ-JavaScript, מטמיעים מחלקה עם שיטות שמסומנות ב-@JavaScriptInterface:
public class AnalyticsWebInterface { public static final String TAG = "AnalyticsWebInterface"; private FirebaseAnalytics mAnalytics; public AnalyticsWebInterface(Context context) { mAnalytics = FirebaseAnalytics.getInstance(context); } @JavascriptInterface public void logEvent(String name, String jsonParams) { LOGD("logEvent:" + name); mAnalytics.logEvent(name, bundleFromJson(jsonParams)); } @JavascriptInterface public void setUserProperty(String name, String value) { LOGD("setUserProperty:" + name); mAnalytics.setUserProperty(name, value); } private void LOGD(String message) { // Only log on debug builds, for privacy if (BuildConfig.DEBUG) { Log.d(TAG, message); } } private Bundle bundleFromJson(String json) { // ... } }
אחרי שיוצרים את הממשק המקורי, רושמים אותו ב-WebView כדי שקוד JavaScript שפועל ב-WebView יוכל לראות אותו:
// Only add the JavaScriptInterface on API version JELLY_BEAN_MR1 and above, due to // security concerns, see link below for more information: // https://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object,%20java.lang.String) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { mWebView.addJavascriptInterface( new AnalyticsWebInterface(this), AnalyticsWebInterface.TAG); } else { Log.w(TAG, "Not adding JavaScriptInterface, API Version: " + Build.VERSION.SDK_INT); }
תיעוד ידני של אירועי רכישה באפליקציה ב-WebView ב-iOS
אתם יכולים לתעד באופן ידני אירועי IAP ב-WebView באמצעות Analytics SDK בגרסה 12.5.0 ואילך.
function logManualPurchaseEvent() {
// For manually tracking in-app purchases within a WebView, log the in-app purchase event:
logEvent("in_app_purchase", {
currency: "USD",
price: 0.99,
product_id: "prod_123",
product_name: "Product 123",
quantity: 1,
value: 0.99,
});
}
חשוב לזכור שה-SDK ימשיך לתעד באופן אוטומטי רכישות באפליקציה כשאפשר, ולא יבטל כפילויות של אירועי רכישה באפליקציה שמתועדים באופן ידני.
השלבים הבאים
כדי לראות הטמעה פונקציונלית מלאה של Google Analytics ב-WebView, עיינו בדוגמה של analytics-webview.