|
|
(12 intermediate revisions by 2 users not shown) |
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. | | # 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. |
| # '''[[#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.
| | # Immediately following the initialization of the Nielsen SDK ensure you call the userOptOut API with Opt out selection: |
| # '''[[#Global_iOS_SDK_No_ID_Opt-out|Global iOS SDK No ID Opt-out]]''' - Direct call to SDK. Should be used for Kids Category. | | <syntaxhighlight lang=swift>NielsenAppApi?.userOptOut("nielsenappsdk://1"); // User opt-out</syntaxhighlight> |
| __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.
| | === Required Privacy Links === |
| * If the User's device is running < iOS 13.x, the Nielsen SDK will check the status of '''Limit Ad Tracking'''.
| | Users must either have access to the "About Nielsen Measurement" page, or have similar text available within the native app. Include "About Nielsen Measurement" and "Your Choices" link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy. |
| * 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. | | 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> | | <blockquote> |
| | | '''"Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see https://global.nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/ |
| 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
| | </blockquote> |
| | |
| ==== 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]]];
| |
| }}
| |
| | |
|
| |
|
| | === Retrieve current Opt-Out preference === |
| | Whether the user is opted out via OS-level Opt-out or via User Choice Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API |
| | <syntaxhighlight lang="objective-c"> |
| | @property (readonly) BOOL optOutStatus |
| </syntaxhighlight> | | </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.
| | === Display OptOut Notice === |
| | | Nielsen does not use cookies in measurement in Ireland; however, you may want to present this information to your user. Sample code on how to do this is below: |
| 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 ==== | | ==== Sample Code ==== |
| ===== Swift =====
| |
| <syntaxhighlight lang="swift"> | | <syntaxhighlight lang="swift"> |
| import UIKit | | import UIKit |
Line 113: |
Line 43: |
| override func viewDidLoad() { | | override func viewDidLoad() { |
| super.viewDidLoad() | | super.viewDidLoad() |
| | // For English use: https://sites.nielsen.com/priv/browser/cookie-policy-ie-en.html |
| | // For Gaelic use: https://sites.nielsen.com/priv/browser/cookie-policy-ie-ga.html |
|
| |
|
| if let appApi = self.nielsenApi {
| | if let url = URL(string: "https://sites.nielsen.com/priv/browser/cookie-policy-ie-en.html") { |
| //Getting the optPut URL from SDK
| |
| if let url = URL(string: appApi.optOutURL) { | |
| webView.load(URLRequest(url: url)) | | webView.load(URLRequest(url: url)) |
| webView.allowsBackForwardNavigationGestures = true | | webView.allowsBackForwardNavigationGestures = true |
| }}}
| | |
| | }}} |
|
| |
|
| func closeOptOutView() { | | func closeOptOutView() { |
| self.dismiss(animated: true, completion: nil) | | 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> | | </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.
| |
| # Immediately following the initialization of the Nielsen SDK ensure you call the userOptOut API with Opt out selection:
| |
| <syntaxhighlight lang=swift>NielsenAppApi?.userOptOut("nielsenappsdk://1"); // User opt-out</syntaxhighlight>
| |