Implementa un controlador JavaScript
El primer paso para usar Google Analytics en WebView es crear funciones de JavaScript a fin de reenviar eventos y propiedades del usuario al código nativo. En el siguiente ejemplo, se muestra cómo hacerlo de una manera compatible con el código nativo de Android y de 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."); } }
Llama al controlador de JavaScript desde tu WebView
Para registrar eventos y establecer propiedades del usuario de forma correcta desde un WebView, llama a las funciones de JavaScript que definiste en el paso anterior. En el siguiente ejemplo, se muestra cómo registrar correctamente un evento de compra y establecer una propiedad del usuario como ejemplo: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") }
Implementa una interfaz nativa
Para invocar código nativo de Apple desde JavaScript, crea una clase de controlador
de mensajes conforme al protocolo WKScriptMessageHandler. Puedes hacer
llamadas a Google Analytics dentro de la
devolución de llamada 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"]]; } }
Por último, agrega el controlador de mensajes al controlador de contenido del usuario de WebView:
Swift
self.webView.configuration.userContentController.add(self, name: "firebase")
Objective-C
[self.webView.configuration.userContentController addScriptMessageHandler:self name:@"firebase"];
Registra eventos de compra directa desde la app de forma manual en un WebView en iOS
Puedes registrar manualmente eventos de IAP en un WebView con la versión 12.5.0 o posterior del SDK de Analytics.
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,
});
}
Ten en cuenta que el SDK seguirá registrando automáticamente las compras directas desde la app siempre que sea posible y no quitará los duplicados de los eventos de compra directa desde la app registrados manualmente.
Próximos pasos
Para ver una implementación completamente funcional de Google Analytics en WebView, consulta el ejemplo de analytics-webview.