Template

Template:iOS NielsenAppSDKJSHandler

From Engineering Client Portal

Using the NielsenAppSDKJSHandler

There could be a scenario in which a browser page, that is already tagged with the Nielsen BSDK, needs to be loaded via a webview. In this situation it is recommended to use the NielsenAppSDKJSHandler which will allow communication between the AppSDK and the BSDK.

This feature is supported in versions 7.2 and above.

Implementation

  • Make sure you have the latest NielsenAppApi.framework from Nielsen containing the NielsenAppSDKJSHandler class.
  • Add NielsenAppSDKJSHandler instance as web view message handler object conforming to WKScriptMessageHandler protocol with name: "NielsenSDKMsg".


Objective-C:

self.jsAppSDK = [[NielsenAppSDKJSHandler alloc] init];
[self.webView.configuration.userContentController addScriptMessageHandler:self.jsAppSDK name:@"NielsenSDKMsg"];


Swift:

self.jsAppSDK=NielsenAppSDKJSHandler(apiType: "ggPM")
if let jsAppSDK = self.jsAppSDK{
   self.webView?.configuration.userContentController.add(jsAppSDK, name: "NielsenSDKMsg")


This will enable listening to BSDK api calls within the APPSDK. Please make sure your Technical Account Manager is aware that you wish to implement this method so a configuration file can be modified on the Nielsen servers; however, there are no changes required to the Browser page.

Example:

The below is an example of opening a webview with the NielsenApp[SDKJSHandler using Swift 5.0

  let jsFunctionNativeMessage = "NielsenSDKMsg"
  var jsAppSDK: NielsenAppSDKJSHandler?
    
    override func loadView() {
        webView = WKWebView()
        webView.navigationDelegate = self
        view = webView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let url = URL(string: "https://nielsen.com/index.htm")!
        self.jsAppSDK=NielsenAppSDKJSHandler(apiType: "ggPM")
        if let jsAppSDK = self.jsAppSDK{
            self.webView?.configuration.userContentController.add(jsAppSDK, name: "NielsenSDKMsg")
            webView.load(URLRequest(url: url))
            webView.allowsBackForwardNavigationGestures = true
        }
}
    deinit {
        if let webView = self.webView {
            webView.configuration.userContentController.removeScriptMessageHandler(forName: jsFunctionNativeMessage)
        }
        self.jsAppSDK = nil
        if let webView = self.webView {
            webView.removeFromSuperview()
        }
        self.webView = nil
    }
}


Please note: The page you load into the webview cannot have mixed protocol content. For example, if your page is https:// you cannot have any images on the page as http:// or you will encounter errors.