تنفيذ معالج 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
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
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
يمكنك تسجيل أحداث الشراء داخل التطبيق يدويًا في 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.