Implement JavaScript handler
The first step in using Google Analytics in a WebView is to create JavaScript functions to forward events and user properties to native code. The following example shows how to do this in a way that is compatible with both Android and Apple native code: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." ); } }
Call the JavaScript handler from your WebView
You can properly log events and set user properties from within a WebView by calling the JavaScript functions that you defined in the previous step. The following example shows how to properly log a purchase event and set a user property as an example: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" ) }
Implement native interface
To invoke native Apple code from JavaScript, create a message handler class
conforming to the WKScriptMessageHandler 
protocol. You can make Google Analytics 
calls inside the  userContentController:didReceiveScriptMessage: 
 
callback:
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" ]]; } }
Finally, add the message handler to the webview's user content controller:
Swift
self . webView . configuration . userContentController . add ( self , name : "firebase" )
Objective-C
[ self . webView . configuration . userContentController addScriptMessageHandler : self name : @"firebase" ];
Log in-app purchase events manually in a WebView on iOS
You can manually log IAP events in a WebView using Analytics SDK v12.5.0 or higher.
  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 
 , 
  
 }); 
 } 
 
 
Note that the SDK will continue to automatically log in-app purchases where possible, and won't de-duplicate any manually logged in-app purchase events.
Next Steps
For a fully functional implementation of Google Analytics in a WebView, see the analytics-webview sample.

