Template

iOS Privacy and Opt-Out: Difference between revisions

From Engineering Client Portal

Line 1: Line 1:
== Privacy and Opt-Out ==
== Privacy and Opt-Out ==
There are two primary methods for implementing user Opt-out preferences:
There are currently 3 flavors of the Nielsen SDK:  
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''AppTracking'' or ''Limit Ad Tracking'' setting on device ('''preferred approach''').
# '''[[#Global iOS SDK|Global iOS SDK Opt-out]]''' - managed by ''AppTracking'' or ''Limit Ad Tracking'' setting on device ('''preferred approach''').
# '''[[#User Choice|User Choice]]''' - Direct call to SDK. Can be used without the Ad Framework
# '''[[#Global iOS SDK No Ad Framework|Global iOS SDK No Ad Framework Optout]]''' - Direct call to SDK. Can be used without the Ad Framework
# '''[[#Global iOS SDK No ID|Global iOS SDK No ID Optout]]''' - Direct call to SDK. Should be used for Kids Category.


=== Special Note Regarding Apps in the '''Kids Category''' ===
=== Global iOS SDK 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>
 
=== OS-level Opt-out ===
''OS-level Opt-out'' method available on Nielsen iOS  
''OS-level Opt-out'' method available on Nielsen iOS  


Line 16: Line 11:
*  If the User's device is running < iOS 13.x, the Nielsen SDK will check the status of '''Limit Ad Tracking'''.
*  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.
*  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 ====
==== Webview Example  ====
It is a requirement to display a WebView element whose loadUrl is set to the value obtained from optOutURL.
The below code is an example of displaying the Nielsen Privacy page to the user.
If using the Global iOS SDK, this optOutURL informs the user how to deactivate/activate “App Tracking/Limit Ad Tracking”.
<syntaxhighlight lang="swift">
 
import UIKit
In addition, The following text must be included in your app store description.
import WebKit
<blockquote>"Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see https://nielsen.com/digitalprivacy/ for more information"</blockquote>
import NielsenAppApi


class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {
=== Global iOS SDK No Ad Framework Optout ===
    var webView: WKWebView!
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 userand capture their selection.
    var nielsenApi: NielsenAppApi!
   
    override func loadView() {
        webView = WKWebView()
        webView.navigationDelegate = self
        view = webView  }
   
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: "new_ios_bg.png")!)
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)  //create an instance
       
        if let appApi = self.nielsenApi {
            //Getting the optPut URL from SDK
            if let url = URL(string: appApi.optOutURL) { //query the nielsensdk for the current privacy page
                webView.load(URLRequest(url: url))
                webView.allowsBackForwardNavigationGestures = true
            }}}}


</syntaxhighlight>
Similar to the Global iOS SDK Flavor, it is a requirement to display a WebView element whose loadUrl is set to the
<br>
value obtained from optOutURL. This is a special URL that indicates Opt-in, or Opt-out and close the WebView.
-->
=== User Choice ===
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].


==== The User Choice opt-out method works as follows: ====
==== This opt-out method works as follows: ====
* Get the Nielsen opt-out URL via [[optOutURL]]
* Get the Nielsen opt-out URL via [[optOutURL]]
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]
Line 60: Line 33:
** Example: <syntaxhighlight lang=swift>NielsenAppApi?.userOptOut("nielsenappsdk://1"); // User opt-out</syntaxhighlight>
** Example: <syntaxhighlight lang=swift>NielsenAppApi?.userOptOut("nielsenappsdk://1"); // User opt-out</syntaxhighlight>


==== Opt-out example code ====
=== Global iOS SDK No ID Optout (Kids Category) ===
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>
 
== Opt-out example code ==
===== Swift =====
===== Swift =====
<syntaxhighlight lang="swift">
<syntaxhighlight lang="swift">
Line 91: Line 70:
         }
         }
    
    
// Uncomment below code if you are using User Choice.  This will receive the user's selection
// Uncomment below code if you are using the Global iOS SDK No Ad Framework Flavor.  This will receive the user's selection
// From the custom User_Choice opt out page.  Only required for non-ad framework or no-id builds
// From the custom User_Choice opt out page.  Only required for non-ad framework or no-id builds
// of the Nielsen SDK
// of the Nielsen SDK
Line 144: Line 123:
}
}


// Uncomment below code if you are using User Choice. This will receive the user's selection
//Uncomment below code if you are using the Global iOS SDK No Ad Framework Flavor.
// From the custom User_Choice opt out page.  Only required for non-ad framework or no-id builds
// From the custom User_Choice opt out page.  Only required for non-ad framework or no-id builds
// of the Nielsen SDK
// of the Nielsen SDK
Line 173: Line 152:
</syntaxhighlight>
</syntaxhighlight>


=== Retrieve current Opt-Out preference ===
== 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
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="Swift">
<syntaxhighlight lang="objective-c">
print("Optout status is", nielsenApi.optOutStatus) // example of printing optout status to the console.
@property (readonly) BOOL optOutStatus
</syntaxhighlight>
</syntaxhighlight>
=== Required Privacy Links ===
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.
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://www.nielsen.com/us/en/legal/privacy-statement/digital-measurement/ for more information"'''</blockquote>

Revision as of 20:16, 30 August 2021

Privacy and Opt-Out

There are currently 3 flavors of the Nielsen SDK:

  1. Global iOS SDK Opt-out - managed by AppTracking or Limit Ad Tracking setting on device (preferred approach).
  2. Global iOS SDK No Ad Framework Optout - Direct call to SDK. Can be used without the Ad Framework
  3. Global iOS SDK No ID Optout - Direct call to SDK. Should be used for Kids Category.

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.

"Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see https://nielsen.com/digitalprivacy/ for more information"

Global iOS SDK No Ad Framework Optout

The User Choice method can be used without the Ad Framework, or in situations where the publisher does not wish to use the 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 userand 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.

This opt-out method works 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 = nielsenappsdk://1
    • Opt-in if the WebView URL = nielsenappsdk://0
  • Pass the detected URL to the userOptOut function
    • Example:
      NielsenAppApi?.userOptOut("nielsenappsdk://1"); // User opt-out
      

Global iOS SDK No ID Optout (Kids Category)

If you are building an app that will be listed in the Kids Category:

  1. Ensure that you are using the NoID version of the Nielsen SDK Framework.
  2. Immediately following the initialization of the Nielsen SDK ensure you call the userOptOut API with Opt out selection:
NielsenAppApi?.userOptOut("nielsenappsdk://1"); // User opt-out

Opt-out example code

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)
        }
  
// Uncomment below code if you are using the Global iOS SDK No Ad Framework Flavor.  This will receive the user's selection
// From the custom User_Choice opt out page.  Only required for non-ad framework or no-id builds
// of the Nielsen SDK
/*  
        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)
                    }}}}
  */
}
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]]];
}

//Uncomment below code if you are using the Global iOS SDK No Ad Framework Flavor.
// From the custom User_Choice opt out page.  Only required for non-ad framework or no-id builds
// of the Nielsen SDK
/*     
- (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);
            }}}
*/
}

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

@property (readonly) BOOL optOutStatus