استخدام "إحصاءات Google" في WebView

يجب إعادة توجيه الطلبات التي يتم إطلاقها من داخل WebView لتسجيل الأحداث أو ضبط خصائص المستخدمين إلى الرموز البرمجية الأصلية قبل إرسالها إلى Google Analytics.

تنفيذ معالج JavaScript

الخطوة الأولى لاستخدام Google Analytics في WebView هي إنشاء دوال JavaScript لإعادة توجيه الأحداث وخصائص المستخدمين إلى الرموز البرمجية الأصلية. يوضّح المثال التالي كيفية إجراء ذلك بطريقة متوافقة مع الرموز البرمجية الأصلية لكل من Android و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 من 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، أنشئ فئة معالِج رسائل تتوافق مع بروتوكول WKScriptMessageHandler. يمكنك إجراء طلبات Google Analytics داخل رد الاتصال userContentController:didReceiveScriptMessage::

Swift

ملاحظة: لا يتوفّر منتج Firebase هذا على هدف watchOS.
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"]];
  }
}

أخيرًا، أضِف معالج الرسائل إلى وحدة التحكّم في محتوى المستخدم في WebView:

Swift

ملاحظة: لا يتوفّر منتج Firebase هذا على هدف watchOS.
self.webView.configuration.userContentController.add(self, name: "firebase")

Objective-C

ملاحظة: لا يتوفّر منتج Firebase هذا على هدف watchOS.
[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

يمكنك تسجيل أحداث الشراء داخل التطبيق يدويًا في WebView باستخدام الإصدار 12.5.0 أو إصدار أحدث من حزمة تطوير البرامج (SDK) لخدمة "إحصاءات Google".

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.