|
|
Line 1: |
Line 1: |
| == Privacy and Opt-Out == | | == Privacy and Opt-Out == |
| | The Irish Market build of the Nielsen SDK automatically Opt's Users out of the collection of any User Identifiable information or any Device Advertising ID. |
|
| |
|
| There are currently 3 flavors of the Nielsen SDK. Please check the "Implementation" section for a comparison of the three flavors. Implementing opt-out for the three flavors are different:
| | When building your app: |
| # '''[[#Global_iOS_SDK_Opt-out|Global iOS SDK Opt-out]]''' - managed by ''AppTracking'' or ''Limit Ad Tracking'' setting on device.
| |
| # '''[[#Global_iOS_SDK_No_Ad_Framework_Opt-out|Global iOS SDK No Ad Framework Opt-out]]''' - Direct call to SDK. Can be used without the Ad Framework.
| |
| # '''[[#Global_iOS_SDK_No_ID_Opt-out|Global iOS SDK No ID Opt-out]]''' - Direct call to SDK. Should be used for Kids Category.
| |
| __NOTOC__
| |
| === Global iOS SDK Opt-out ===
| |
| ''OS-level Opt-out'' method available on Nielsen iOS
| |
| | |
| The Nielsen SDK automatically leverages the iOS's '''Limit Ad Tracking''' or '''AppTracking''' setting.
| |
| * If the User's device is running < iOS 13.x, the Nielsen SDK will check the status of '''Limit Ad Tracking'''.
| |
| * iOS14 modifies the way Apple manages the collection of a User's Opt-In status through '''AppTracking'''. Starting with Version 8.x+, the Nielsen App SDK will check the iOS version during initialization. If the device is running iOS12 or iOS13, the Limit Ad Tracking setting is requested. If iOS14.x +, then AppTracking is utilized.
| |
| ==== Webview Element ====
| |
| It is a requirement to display a WebView element whose loadUrl is set to the value obtained from optOutURL.
| |
| If using the Global iOS SDK, this optOutURL informs the user how to deactivate/activate “App Tracking/Limit Ad Tracking”.
| |
| | |
| In addition, the following text must be included in your app store description.
| |
| <blockquote>"Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see https://sites.nielsen.com/priv/browser/us/en/optout.html for more information"</blockquote>
| |
| | |
| If you are implementing on AppleTV here are your Opt Out verbiage options : https://engineeringportal.nielsen.com/docs/DCR_Video_%26_Static_CTV_Device_SDK_Privacy
| |
| | |
| ==== Sample Code for Global Build ====
| |
| ===== Swift =====
| |
| <syntaxhighlight lang="swift">
| |
| import UIKit
| |
| import WebKit
| |
| import NielsenAppApi
| |
| | |
| class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {
| |
| var nielsenApi : NielsenAppApi!
| |
| var webView: WKWebView!
| |
|
| |
| override func loadView() {
| |
| webView = WKWebView()
| |
| webView.navigationDelegate = self
| |
| view = webView
| |
| }
| |
| | |
| override func viewDidLoad() {
| |
| super.viewDidLoad()
| |
| | |
| if let appApi = self.nielsenApi {
| |
| //Getting the optPut URL from SDK
| |
| if let url = URL(string: appApi.optOutURL) {
| |
| webView.load(URLRequest(url: url))
| |
| webView.allowsBackForwardNavigationGestures = true
| |
| }}}
| |
| | |
| func closeOptOutView() {
| |
| self.dismiss(animated: true, completion: nil)
| |
| }}
| |
| </syntaxhighlight>
| |
| | |
| ===== Objective-C =====
| |
| <syntaxhighlight lang="objective-c">
| |
| | |
| #import "OptOutVC.h"
| |
| #import "NielsenInit.h"
| |
| #import <NielsenAppApi/NielsenAppApi.h>
| |
| | |
| @interface OptOutVC ()
| |
| | |
| @property (weak, nonatomic) IBOutlet UIWebView *webView;
| |
| @end
| |
| | |
| @implementation OptOutVC
| |
| | |
| - (void)viewDidLoad {
| |
| [super viewDidLoad];
| |
| | |
| - (void)viewDidLoad {
| |
| [super viewDidLoad];
| |
| //Getting the optPut URL from eventTracker
| |
| [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL
| |
| URLWithString:self.nielsenApi.optOutURL]]];
| |
| }}
| |
| | |
| | |
| </syntaxhighlight>
| |
| | |
| === Global iOS SDK No Ad Framework Opt-out ===
| |
| The ''User Choice'' method can be used without the Ad Framework, or in situations where the publisher does not wish to use the [https://developer.apple.com/documentation/apptrackingtransparency App Tracking Transparency Framework]. As this flavor of the Nielsen SDK does not use the Ad Framework, so it is necessary to display an Optout Page to the user and capture their selection.
| |
| | |
| Similar to the Global iOS SDK Flavor, it is a requirement to display a WebView element whose loadUrl is set to the
| |
| value obtained from optOutURL. This is a special URL that indicates Opt-in, or Opt-out and close the WebView. '''The steps are as follows:'''
| |
| | |
| * Get the Nielsen opt-out URL via [[optOutURL]]
| |
| * Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]
| |
| * Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView
| |
| ** Opt-out if the WebView URL = <code>nielsenappsdk://1</code>
| |
| ** Opt-in if the WebView URL = <code>nielsenappsdk://0</code>
| |
| * Pass the detected URL to the [[userOptOut]] function
| |
| ** Example: <syntaxhighlight lang=swift>NielsenAppApi?.userOptOut("nielsenappsdk://1"); // User opt-out</syntaxhighlight>
| |
| | |
| ==== Sample code for No Ad Framework Build ====
| |
| ===== Swift =====
| |
| <syntaxhighlight lang="swift">
| |
| import UIKit
| |
| import WebKit
| |
| import NielsenAppApi
| |
| | |
| class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {
| |
| var nielsenApi : NielsenAppApi!
| |
| var webView: WKWebView!
| |
|
| |
| override func loadView() {
| |
| webView = WKWebView()
| |
| webView.navigationDelegate = self
| |
| view = webView
| |
| }
| |
| | |
| override func viewDidLoad() {
| |
| super.viewDidLoad()
| |
| | |
| if let appApi = self.nielsenApi {
| |
| //Getting the optPut URL from SDK
| |
| if let url = URL(string: appApi.optOutURL) {
| |
| webView.load(URLRequest(url: url))
| |
| webView.allowsBackForwardNavigationGestures = true
| |
| }}}
| |
| | |
| func closeOptOutView() {
| |
| self.dismiss(animated: true, completion: nil)
| |
| }
| |
| | |
| func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler:
| |
| @escaping (WKNavigationActionPolicy) -> Void) {
| |
| print(navigationAction.request.url?.absoluteString as Any) //For debugging to check what is being passed from webpage.
| |
| if navigationAction.request.url?.absoluteString == "nielsen://close" {
| |
| closeOptOutView()
| |
| decisionHandler(.cancel)
| |
| } else {
| |
| if let url = navigationAction.request.url?.absoluteString, url.hasPrefix("nielsen") {
| |
| nielsenApi?.userOptOut(url). //either nielsenappsdk://1 or nielsenappsdk://0
| |
| decisionHandler(.cancel)
| |
| } else {
| |
| if navigationAction.navigationType == .linkActivated {
| |
| if let url = navigationAction.request.url?.absoluteString, url.hasSuffix("#") {
| |
| decisionHandler(.allow)
| |
| } else {
| |
| decisionHandler(.cancel)
| |
| webView.load(navigationAction.request)
| |
| }
| |
| } else {
| |
| decisionHandler(.allow)
| |
| }}}}
| |
| | |
| }
| |
| | |
| </syntaxhighlight>
| |
| | |
| ===== Objective-C =====
| |
| <syntaxhighlight lang="objective-c">
| |
| | |
| #import "OptOutVC.h"
| |
| #import "NielsenInit.h"
| |
| #import <NielsenAppApi/NielsenAppApi.h>
| |
| | |
| @interface OptOutVC ()
| |
| | |
| @property (weak, nonatomic) IBOutlet UIWebView *webView;
| |
| @end
| |
| | |
| @implementation OptOutVC
| |
| | |
| - (void)viewDidLoad {
| |
| [super viewDidLoad];
| |
| | |
| - (void)viewDidLoad {
| |
| [super viewDidLoad];
| |
| //Getting the optPut URL from eventTracker
| |
| [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL
| |
| URLWithString:self.nielsenApi.optOutURL]]];
| |
| }
| |
|
| |
| - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
| |
| decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
| |
| {
| |
| if ([navigationAction.request.URL.absoluteString isEqualToString:kNielsenWebClose])
| |
| { [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];
| |
| decisionHandler(WKNavigationActionPolicyCancel);
| |
| } else {
| |
| if ([navigationAction.request.URL.absoluteString hasPrefix:@"nielsen"])
| |
| {[self.nielsenAppApi userOptOut:navigationAction.request.URL.absoluteString];
| |
| decisionHandler(WKNavigationActionPolicyCancel);
| |
| } else {
| |
| if (navigationAction.navigationType == WKNavigationTypeLinkActivated)
| |
| { if ([navigationAction.request.URL.absoluteString hasSuffix:@"#"])
| |
| {decisionHandler(WKNavigationActionPolicyAllow);
| |
| } else {
| |
| decisionHandler(WKNavigationActionPolicyCancel);
| |
| [webView loadRequest:[NSURLRequest requestWithURL:navigationAction.request.URL]];
| |
| }} else {
| |
| decisionHandler(WKNavigationActionPolicyAllow);
| |
| }}}
| |
| }
| |
| | |
| </syntaxhighlight>
| |
| | |
| | |
| === Global iOS SDK No ID Opt-out ===
| |
| If you are building an app that will be listed in the Kids Category:
| |
| # Ensure that you are using the [https://nielsendownloads-green.digitalengsdk.com/digital/Nielsen-iOS-App-SDK-GlobalNoId_latest.zip NoID version] of the Nielsen SDK Framework. | | # Ensure that you are using the [https://nielsendownloads-green.digitalengsdk.com/digital/Nielsen-iOS-App-SDK-GlobalNoId_latest.zip NoID version] of the Nielsen SDK Framework. |
| # Immediately following the initialization of the Nielsen SDK ensure you call the userOptOut API with Opt out selection: | | # Immediately following the initialization of the Nielsen SDK ensure you call the userOptOut API with Opt out selection: |