<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nielsentest.mywikis.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=YaminiKumawat</id>
	<title>Engineering Client Portal - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://nielsentest.mywikis.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=YaminiKumawat"/>
	<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/wiki/Special:Contributions/YaminiKumawat"/>
	<updated>2026-04-08T03:24:02Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3586</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3586"/>
		<updated>2019-03-21T20:18:09Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: removed containerId info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab for the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| &amp;lt;code&amp;gt; &amp;quot;AID885-9984&amp;quot; &amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || &amp;lt;code&amp;gt; &amp;quot;homeSection&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueA&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueB&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueC&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3585</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3585"/>
		<updated>2019-03-21T20:17:03Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: removed containerId obj init info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab for the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| &amp;lt;code&amp;gt; &amp;quot;AID885-9984&amp;quot; &amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || &amp;lt;code&amp;gt; &amp;quot;homeSection&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueA&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueB&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueC&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3584</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3584"/>
		<updated>2019-03-21T20:16:12Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: forgot a semicolon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| &amp;lt;code&amp;gt; &amp;quot;AID885-9984&amp;quot; &amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || &amp;lt;code&amp;gt; &amp;quot;homeSection&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueA&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueB&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueC&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3583</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3583"/>
		<updated>2019-03-21T20:15:33Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: removed containerId info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| &amp;lt;code&amp;gt; &amp;quot;AID885-9984&amp;quot; &amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || &amp;lt;code&amp;gt; &amp;quot;homeSection&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueA&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueB&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueC&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3582</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3582"/>
		<updated>2019-03-21T20:14:18Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: removed containerId obj init info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| &amp;lt;code&amp;gt; &amp;quot;AID885-9984&amp;quot; &amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || &amp;lt;code&amp;gt; &amp;quot;homeSection&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueA&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueB&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueC&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3581</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3581"/>
		<updated>2019-03-21T20:10:21Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: removed &amp;quot;containerId&amp;quot; information from chart&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab for the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| &amp;lt;code&amp;gt; &amp;quot;AID885-9984&amp;quot; &amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || &amp;lt;code&amp;gt; &amp;quot;homeSection&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueA&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueB&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueC&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3580</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3580"/>
		<updated>2019-03-21T20:09:22Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: removed &amp;quot;containerId&amp;quot; information from chart&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| &amp;lt;code&amp;gt; &amp;quot;AID885-9984&amp;quot; &amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || &amp;lt;code&amp;gt; &amp;quot;homeSection&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueA&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueB&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueC&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3579</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3579"/>
		<updated>2019-03-21T20:04:26Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: removed as this feature is not yet live&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| &amp;lt;code&amp;gt; &amp;quot;AID885-9984&amp;quot; &amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || &amp;lt;code&amp;gt; &amp;quot;homeSection&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueA&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueB&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueC&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3578</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3578"/>
		<updated>2019-03-21T16:50:05Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: minor value edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| &amp;lt;code&amp;gt; &amp;quot;AID885-9984&amp;quot; &amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || &amp;lt;code&amp;gt; &amp;quot;homeSection&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueA&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueB&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueC&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3577</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3577"/>
		<updated>2019-03-21T16:50:01Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: minor value edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab for the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| &amp;lt;code&amp;gt; &amp;quot;AID885-9984&amp;quot; &amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || &amp;lt;code&amp;gt; &amp;quot;homeSection&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueA&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueB&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || &amp;lt;code&amp;gt; &amp;quot;CustomSegmentValueC&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3576</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3576"/>
		<updated>2019-03-21T16:46:29Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: minor edit to adidx description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab for the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3575</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3575"/>
		<updated>2019-03-21T16:46:27Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: minor edit to adidx description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad index (See the &amp;quot;Managing Ads&amp;quot; section below) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3574</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3574"/>
		<updated>2019-03-21T16:39:59Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed chart headers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad Index (*See Note below*) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3573</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3573"/>
		<updated>2019-03-21T16:39:45Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed chart headers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab for the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key	!! Description	!! Example	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad (no [[Special Characters]])	|| &amp;lt;code&amp;gt;&amp;quot;AD12345&amp;quot;&amp;lt;/code&amp;gt;	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || &amp;lt;code&amp;gt;&amp;quot;ADtitle&amp;quot;&amp;lt;/code&amp;gt; || No&lt;br /&gt;
|-&lt;br /&gt;
|adldx || ad Index (*See Note below*) || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad (&amp;quot;preroll&amp;quot;, &amp;quot;midroll&amp;quot;, or &amp;quot;postroll&amp;quot;) || &amp;lt;code&amp;gt; &amp;quot;preroll&amp;quot; &amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad, in seconds || &amp;lt;code&amp;gt; &amp;quot;20&amp;quot; &amp;lt;/code&amp;gt; || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3572</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3572"/>
		<updated>2019-03-21T16:31:27Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: syntax change on DTVR id3 example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3571</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3571"/>
		<updated>2019-03-21T16:30:51Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: syntax change on DTVR id3 example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab for the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3570</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3570"/>
		<updated>2019-03-21T16:28:51Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: edits to DTVR table&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab for the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3569</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3569"/>
		<updated>2019-03-21T16:28:50Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: edits to DTVR table&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead, pause, &lt;br /&gt;
complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete, adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''channelName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (32 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''type''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 'content', 'ad', 'static' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;content&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample event for DTVR.  If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3568</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3568"/>
		<updated>2019-03-21T15:51:22Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: grammar change&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab for the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3567</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3567"/>
		<updated>2019-03-21T15:50:21Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: Changes to DCR content metadata table&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab for the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3566</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3566"/>
		<updated>2019-03-21T15:49:57Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: grammar edit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the tab of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3565</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3565"/>
		<updated>2019-03-21T15:22:38Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changes to content metadata table on DCR tab&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadPosition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Key &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;B66473&amp;quot; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;3600&amp;quot;&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyProgram&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;CustomSegmentValueB&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;segmentC&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;S2,E3&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;HomePage&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;20180120 10:00:00&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- not a full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;Standard Episode ID&amp;quot;	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Provided by Nielsen &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes (if distributor)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear (&amp;quot;1&amp;quot;) vs dynamic (&amp;quot;2&amp;quot;) ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single brand to receive more granular reports.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If there are no ad or static values, the values for these keys can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3564</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3564"/>
		<updated>2019-03-21T14:27:27Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: modified &amp;quot;complete&amp;quot; event description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3563</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3563"/>
		<updated>2019-03-21T14:23:43Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: modified description of &amp;quot;sfcode&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3562</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3562"/>
		<updated>2019-03-21T14:23:24Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: modified description of sfcode&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Specifies the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3561</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3561"/>
		<updated>2019-03-21T14:22:47Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: modified description of sfcode and nol_devDebug&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Determines the Nielsen collection facility to which the SDK should connect&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3560</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3560"/>
		<updated>2019-03-21T14:21:55Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: modified description of &amp;quot;nol_devDebug&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging and is only required for testing. ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3559</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3559"/>
		<updated>2019-03-21T14:19:29Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: removed &amp;quot; iOS using Xcode and &amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3558</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3558"/>
		<updated>2019-03-21T14:19:12Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: removed &amp;quot; and Android using Android Studio&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3492</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3492"/>
		<updated>2019-03-04T23:05:15Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: edited complete event description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=https://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the  IOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release ([[iOS_Static_Framework_Setup|static framework]] is still available).&lt;br /&gt;
&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required:&amp;lt;code&amp;gt; [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++] &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dynamic framework is created as a fat framework. It means that it contains slices required for devices (armv7, arm64) as well as slices required for simulators (i386, x86_64). Simulator slices are needed to let clients build and debug their app on the simulators, but they should be removed before sending the app to the AppStore. The example of the shell script that should be added as a Run Script phase in the application can be [[DCR_Video_iOS_SDK#Removing_Simulators|found below]].&lt;br /&gt;
&lt;br /&gt;
=== How to obtain the NielsenAppApi.Framework ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain Cocoapod implementation guide]]&lt;br /&gt;
&lt;br /&gt;
=== Configuring Xcode Development Environment ===&lt;br /&gt;
Starting with SDK version 6.0.0.0, the Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.  In addition, the framework support modules, so all the required frameworks are linked automatically as the are needed.  More details can be found here: https://stackoverflow.com/questions/24902787/dont-we-need-to-link-framework-to-xcode-project-anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Download Framework ===&lt;br /&gt;
The first step is to download and copy the [[Special:Downloads|NielsenAppApi.framework]] bundle to the app project directory.&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
=== Import Framework ===&lt;br /&gt;
Add NielsenAppApi.framework module in the source file of your app:&lt;br /&gt;
&lt;br /&gt;
==== Using Swift ====&lt;br /&gt;
You can use Objective-C and Swift files together in a single project, no matter which language the project used originally. This makes creating mixed-language app and framework targets as straightforward as creating an app or framework target written in a single language.&lt;br /&gt;
&lt;br /&gt;
For more detailed information regarding importing [https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift Objective-C into Swift]&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
Add the code  to the View Controller’s header file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
This event should be called when the session is completed, ends, or the user initiates a stop.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Template:sandbox&amp;diff=3387</id>
		<title>Template:sandbox</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Template:sandbox&amp;diff=3387"/>
		<updated>2019-02-06T20:36:55Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: test template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello world&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3107</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3107"/>
		<updated>2019-01-08T19:23:39Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: Changed id3Data type from object to string&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3106</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3106"/>
		<updated>2019-01-08T19:23:34Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: Changed id3Data type from object to string&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
'''Configuring Xcode Development Environment''' &lt;br /&gt;
&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.&lt;br /&gt;
&lt;br /&gt;
The SDK uses the NSURLSession instead of the deprecated NSURLConnection.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Importing Frameworks'''&amp;lt;/big&amp;gt;&lt;br /&gt;
The first step is to ensure that the following frameworks and libraries are imported into the Frameworks folder of the Xcode project before creating an instance of the Nielsen App SDK object.&lt;br /&gt;
* UIKit.framework&lt;br /&gt;
* Foundation.framework&lt;br /&gt;
* AdSupport.framework&lt;br /&gt;
* JavascriptCore.framework&lt;br /&gt;
* WebKit.framework&lt;br /&gt;
* SystemConfiguration.framework&lt;br /&gt;
* Security.framework&lt;br /&gt;
** Nielsen Analytics framework makes use of a number of functions in this library.&lt;br /&gt;
* AVFoundation.framework&lt;br /&gt;
* NielsenAppApi.framework&lt;br /&gt;
* libc++.tbd (as SDK contains Objective C++ source file)&lt;br /&gt;
** Alternatively, include -lstdc++ in Build Settings → Other Linker Flag of the Xcode project&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Example'''&lt;br /&gt;
* Extract “NielsenAppApi.Framework” from the Nielsen App SDK sample app and copy it to Frameworks folder of the Xcode project.&lt;br /&gt;
* Add the code &amp;lt;code&amp;gt;-#import NielsenAppApi/NielsenAppApi.h&amp;lt;/code&amp;gt; to the View Controller’s header file.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Ensure that the following are included in the Linked Frameworks and Libraries list (located in the project’s Summary settings).&lt;br /&gt;
* Nielsen App SDK&lt;br /&gt;
* iOS security framework&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Using Swift ===&lt;br /&gt;
To import a set of Objective-C files in the same app target as your Swift code, you rely on an Objective-C bridging header to expose those files to Swift. Xcode offers to create this header file when you add a Swift file to an existing Objective-C app, or an Objective-C file to an existing Swift app.&lt;br /&gt;
*Select File/New File/Objective-C File&lt;br /&gt;
*Xcode will prompt you to create a bridging header.&lt;br /&gt;
[[File:bridgingheader 2x.png|600px|center|link=]]&lt;br /&gt;
Once this file has been created, you need to add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Using Objective-C ===&lt;br /&gt;
Add the code &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 to the View Controller’s header file.&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3105</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3105"/>
		<updated>2019-01-04T22:14:03Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed &amp;quot;containerID&amp;quot; to &amp;quot;containerId&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3104</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3104"/>
		<updated>2019-01-04T20:26:37Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed &amp;quot;containerID&amp;quot; to &amp;quot;containerId&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
'''Configuring Xcode Development Environment''' &lt;br /&gt;
&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.&lt;br /&gt;
&lt;br /&gt;
The SDK uses the NSURLSession instead of the deprecated NSURLConnection.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Importing Frameworks'''&amp;lt;/big&amp;gt;&lt;br /&gt;
The first step is to ensure that the following frameworks and libraries are imported into the Frameworks folder of the Xcode project before creating an instance of the Nielsen App SDK object.&lt;br /&gt;
* UIKit.framework&lt;br /&gt;
* Foundation.framework&lt;br /&gt;
* AdSupport.framework&lt;br /&gt;
* JavascriptCore.framework&lt;br /&gt;
* WebKit.framework&lt;br /&gt;
* SystemConfiguration.framework&lt;br /&gt;
* Security.framework&lt;br /&gt;
** Nielsen Analytics framework makes use of a number of functions in this library.&lt;br /&gt;
* AVFoundation.framework&lt;br /&gt;
* NielsenAppApi.framework&lt;br /&gt;
* libc++.tbd (as SDK contains Objective C++ source file)&lt;br /&gt;
** Alternatively, include -lstdc++ in Build Settings → Other Linker Flag of the Xcode project&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Example'''&lt;br /&gt;
* Extract “NielsenAppApi.Framework” from the Nielsen App SDK sample app and copy it to Frameworks folder of the Xcode project.&lt;br /&gt;
* Add the code &amp;lt;code&amp;gt;-#import NielsenAppApi/NielsenAppApi.h&amp;lt;/code&amp;gt; to the View Controller’s header file.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Ensure that the following are included in the Linked Frameworks and Libraries list (located in the project’s Summary settings).&lt;br /&gt;
* Nielsen App SDK&lt;br /&gt;
* iOS security framework&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Using Swift ===&lt;br /&gt;
To import a set of Objective-C files in the same app target as your Swift code, you rely on an Objective-C bridging header to expose those files to Swift. Xcode offers to create this header file when you add a Swift file to an existing Objective-C app, or an Objective-C file to an existing Swift app.&lt;br /&gt;
*Select File/New File/Objective-C File&lt;br /&gt;
*Xcode will prompt you to create a bridging header.&lt;br /&gt;
[[File:bridgingheader 2x.png|600px|center|link=]]&lt;br /&gt;
Once this file has been created, you need to add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Using Objective-C ===&lt;br /&gt;
Add the code &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 to the View Controller’s header file.&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerId || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Browser_Simplified_API&amp;diff=3099</id>
		<title>Digital Measurement Browser Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Browser_Simplified_API&amp;diff=3099"/>
		<updated>2018-12-13T15:48:50Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for livestream, changed &amp;quot;live stream&amp;quot; to &amp;quot;livestream&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the Simplified SDK for Browser, you will need an '''Appid.'''  This is a Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have an AppID , please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
[http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg Click here to zoom in on image]&lt;br /&gt;
== Manages the order of metadata (ad vs content and playheads) ==&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
== Everything passed via trackevent() ==&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  // Add Static Queue Snippet&lt;br /&gt;
 !function(t,n)&lt;br /&gt;
 {&lt;br /&gt;
   t[n]=t[n]||{nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
   {&lt;br /&gt;
    return s=t.document,&lt;br /&gt;
    r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
    r.async=1,&lt;br /&gt;
    r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
    i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
    i.parentNode.insertBefore(r,i),&lt;br /&gt;
    t[o]=t[o]||{g:c,ggPM:function(n,e,c,r,s){(t[o].q=t[o].q||[]).push([n,e,c,r,s])}},&lt;br /&gt;
    t[o]&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
} &lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
=== Create SDK Instance ===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three variables:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Description !! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid || Unique ID assigned to player/site. || &amp;lt;code&amp;gt;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || Any string value&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug: &amp;quot;debug&amp;quot; || Enables Nielsen console logging. Only required for testing || &amp;lt;code&amp;gt;{nol_sdkDebug: &amp;quot;debug&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;code&amp;gt;&amp;lt;apid&amp;gt;.js&amp;lt;/code&amp;gt;, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: &amp;quot;nlsSDK600.bundle.min.js&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  // Add Static Queue Snippet&lt;br /&gt;
 !function(t,n)&lt;br /&gt;
 {&lt;br /&gt;
   t[n]=t[n]||{nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
   {&lt;br /&gt;
    return s=t.document,&lt;br /&gt;
    r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
    r.async=1,&lt;br /&gt;
    r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
    i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
    i.parentNode.insertBefore(r,i),&lt;br /&gt;
    t[o]=t[o]||{g:c,ggPM:function(n,e,c,r,s){(t[o].q=t[o].q||[]).push([n,e,c,r,s])}},&lt;br /&gt;
    t[o]&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
} &lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for livestream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ++&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds ott information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
ottData:{&lt;br /&gt;
ottStatus:1,&lt;br /&gt;
ottType:casting,&lt;br /&gt;
ottDevice:chromecast,&lt;br /&gt;
ottDeviceName:Google ChromeCast,&lt;br /&gt;
ottDeviceID:1234,&lt;br /&gt;
ottDeviceModel:ChromeCast,&lt;br /&gt;
ottDeviceVersion:1.0.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for livestream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the '''adldx value''', and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account the Nielsen Simplified API will support a new parameter for ad metadata: '''adIdx.''' This parameter is just an index of an individual ad in a sequence of ads. Once the next ad is started the '''adIdx''' parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Opt-Out ==&lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into, Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the opt-out option, include the following two items in your privacy policy&lt;br /&gt;
* A notice that the player includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings)&lt;br /&gt;
* A link to the Nielsen Digital Measurement Privacy Policy at http://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click Choices to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen online measurement, click a link to receive an opt-out cookie.&lt;br /&gt;
&lt;br /&gt;
The following paragraph is a template for an opt-out statement, the properties may feature Nielsen proprietary measurement software, which will allow users to contribute to market research, such as Nielsen TV Ratings. To learn more about the information that Nielsen software may collect and your choices with regard to it, please see the Nielsen Digital Measurement Privacy Policy at http://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html.&lt;br /&gt;
&lt;br /&gt;
=== Opt Back In ===&lt;br /&gt;
Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, their opt-out cookie will be deleted and they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
Once the DCR Tracking Code is added to Instant Articles, Nielsen will validate the implementation. Following Nielsen testing, users need to make a couple of updates to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
# '''App ID''': Ensure that correct &amp;lt;apid&amp;gt; is used during initialization&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# '''Debug Logging''': Disable logging by deleting &amp;lt;code&amp;gt;{nol_sdkDebug: 'DEBUG'}&amp;lt;/code&amp;gt; from initialization call.&lt;br /&gt;
#* '''Example Production Initialization Call''' - Refer to the production initialization call below:&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;);&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3098</id>
		<title>Digital Measurement Android Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Simplified_API&amp;diff=3098"/>
		<updated>2018-12-13T15:48:10Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for livestream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerID || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-1-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Opt out of Ads Personalization'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen Android SDK versions (&amp;lt; 5.1.1.18)&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen Android '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen Android '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen Android SDK 5.1.1.18 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the current Nielsen opt-out URL via [[userOptOutURLString()]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[userOptOutURLString()]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut()]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=java&amp;gt;appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);  // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt Out example code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
WebView webView;&lt;br /&gt;
AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_OUT = &amp;quot;nielsenappsdk://1&amp;quot;;&lt;br /&gt;
  private static final String NIELSEN_URL_OPT_IN = &amp;quot;nielsenappsdk://0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//  Within your app you would provide your User the option to Opt Out.&lt;br /&gt;
//  Perhaps via a toggle or button&lt;br /&gt;
//  This is separate from Limit Ad Tracking &lt;br /&gt;
&lt;br /&gt;
      let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[getOptOutStatus()]] property in the Nielsen Android SDK API,&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OptOutActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    WebView webView;&lt;br /&gt;
    AppSdk appSdk;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCreate(@Nullable Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_optout);&lt;br /&gt;
        webView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
&lt;br /&gt;
        webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
&lt;br /&gt;
        webView.setWebViewClient(new WebViewClient() {&lt;br /&gt;
            @SuppressWarnings(&amp;quot;deprecation&amp;quot;)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {&lt;br /&gt;
                Toast.makeText(OptOutActivity.this, description, Toast.LENGTH_SHORT).show();&lt;br /&gt;
            }&lt;br /&gt;
            @TargetApi(android.os.Build.VERSION_CODES.M)&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {&lt;br /&gt;
                // Redirect to deprecated method, so you can use it in all SDK versions&lt;br /&gt;
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
        appSdk = nielsenInit.initAppSdk(getApplicationContext(), this);&lt;br /&gt;
        //Getting the optPut URL from eventTracker&lt;br /&gt;
        String url = appSdk.userOptOutURLString();&lt;br /&gt;
        webView.loadUrl(url);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
&lt;br /&gt;
[[File:Android1.jpg|thumb]]&lt;br /&gt;
== Android Studio Java Code Example ==&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDK-Android.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.java ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Abdul's Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;ccode&amp;quot;, &amp;quot;123&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;dma&amp;quot;,&amp;quot;456&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;uoo&amp;quot;,&amp;quot;0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Created on 07/02/18.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class SDKMethods {&lt;br /&gt;
&lt;br /&gt;
    public String url = &amp;quot;&amp;quot;;&lt;br /&gt;
    JSONObject content = null;&lt;br /&gt;
  //Loading content Data&lt;br /&gt;
    public JSONObject loadContentData(){&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
        try {&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;cloudApi_app&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180120 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;channelName&amp;quot;,&amp;quot;My Channel 1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;pipMode&amp;quot;,&amp;quot;false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, new JSONObject())&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, new JSONObject());&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
                e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MainActivity.java ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.simplifiedapiapp.activities;&lt;br /&gt;
&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.os.Handler;&lt;br /&gt;
import android.support.v7.app.AppCompatActivity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.SurfaceHolder;&lt;br /&gt;
import android.view.SurfaceView;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.SeekBar;&lt;br /&gt;
&lt;br /&gt;
import com.simplifiedapiapp.utils.Constants;&lt;br /&gt;
import com.simplifiedapiapp.models.NielsenInit;&lt;br /&gt;
import com.simplifiedapiapp.R;&lt;br /&gt;
import com.simplifiedapiapp.models.SDKMethods;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements IAppNotifier, SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {&lt;br /&gt;
&lt;br /&gt;
    public static final String TAG = MainActivity.class.getSimpleName();&lt;br /&gt;
&lt;br /&gt;
    private SurfaceView mSurfaceView;&lt;br /&gt;
    private SeekBar seek;&lt;br /&gt;
    Button btnPlay;&lt;br /&gt;
&lt;br /&gt;
    NielsenEventTracker eventTracker;&lt;br /&gt;
    private int videoType, totalVideos;&lt;br /&gt;
    private int totalVideosPlayed = 0;&lt;br /&gt;
    private boolean isVideoStarted = false, isPaused = false;&lt;br /&gt;
    JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
    private MediaPlayer mMediaPlayer;&lt;br /&gt;
    private SurfaceHolder mSurfaceHolder;&lt;br /&gt;
&lt;br /&gt;
    SDKMethods sdkMethods;&lt;br /&gt;
&lt;br /&gt;
    private ProgressDialog dialog;&lt;br /&gt;
    private Handler playheadHandler;&lt;br /&gt;
    private Runnable playheadRunnable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
&lt;br /&gt;
        //In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = new SDKMethods();&lt;br /&gt;
&lt;br /&gt;
        getIntents();&lt;br /&gt;
        initUI();&lt;br /&gt;
&lt;br /&gt;
        //In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        NielsenInit nielsenInit = new NielsenInit();&lt;br /&gt;
&lt;br /&gt;
        //3rd parameter &amp;quot;this&amp;quot; referes to IAppNotifier interface which is needed to initialise NielsenEventTracker&lt;br /&gt;
        eventTracker = nielsenInit.initEventTracker(getApplicationContext(), this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
&lt;br /&gt;
        //loading static data&lt;br /&gt;
        JSONObject staticObj = sdkMethods.loadStaticData();&lt;br /&gt;
&lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        eventTracker.trackEvent(staticObj);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void initUI() {&lt;br /&gt;
&lt;br /&gt;
        seek = (SeekBar) findViewById(R.id.seek);&lt;br /&gt;
        btnPlay = (Button) findViewById(R.id.btnPlay);&lt;br /&gt;
        btnPlay.setOnClickListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void getIntents() {&lt;br /&gt;
&lt;br /&gt;
        videoType = getIntent().getIntExtra(Constants.INTENT_VIDEO_TYPE, 0);&lt;br /&gt;
        totalVideos = getIntent().getIntExtra(Constants.INTENT_TOTAL_VIDEOS, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (videoType == Constants.onlyContent) {&lt;br /&gt;
&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = sdkMethods.loadContentData();&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            data = sdkMethods.loadPreRollAdData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceCreated Called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (isPaused) {&lt;br /&gt;
            //Once video is resumed after pause, setting surfaceholder to player.&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            //This will execute for first time.&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCompletion(MediaPlayer mediaPlayer) {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            playheadHandler.removeCallbacks(playheadRunnable);&lt;br /&gt;
&lt;br /&gt;
            ///As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
            totalVideosPlayed++;&lt;br /&gt;
&lt;br /&gt;
            if (videoType == Constants.onlyContent || totalVideosPlayed == totalVideos) {&lt;br /&gt;
&lt;br /&gt;
                //on content video complete, updating event as &amp;quot;complete&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;complete&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //on Ad complete, updating event as &amp;quot;adStop&amp;quot; in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;adStop&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            //sending the object to SDK.&lt;br /&gt;
            eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
            releaseMediaPlayer();&lt;br /&gt;
&lt;br /&gt;
            checkVideosToBePlayed();&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void checkVideosToBePlayed(){&lt;br /&gt;
&lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if (totalVideosPlayed != totalVideos) {&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if (videoType == Constants.contentWithOneAd) {&lt;br /&gt;
&lt;br /&gt;
                //loading video content data&lt;br /&gt;
                data = sdkMethods.loadContentData();&lt;br /&gt;
&lt;br /&gt;
            } else if (videoType == Constants.contentWithTwoAds) {&lt;br /&gt;
                if (totalVideosPlayed == 1) {&lt;br /&gt;
&lt;br /&gt;
                    //loading 2nd Ad data&lt;br /&gt;
                    data = sdkMethods.loadMidRollAdData();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    data = sdkMethods.loadContentData();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
            setUpPlayer();&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer.setOnCompletionListener(this);&lt;br /&gt;
            mMediaPlayer.setOnErrorListener(this);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onError(MediaPlayer mediaPlayer, int i, int li) {&lt;br /&gt;
        Log.e(TAG, &amp;quot;Player error codes:&amp;quot; + i + &amp;quot;, &amp;quot; + li);&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //creating player&lt;br /&gt;
    private void setUpPlayer() {&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            mMediaPlayer = new MediaPlayer();&lt;br /&gt;
            mMediaPlayer.setDisplay(mSurfaceHolder);&lt;br /&gt;
            mMediaPlayer.setDataSource(sdkMethods.url);&lt;br /&gt;
            mMediaPlayer.setOnPreparedListener(MainActivity.this);&lt;br /&gt;
            mMediaPlayer.prepareAsync();&lt;br /&gt;
&lt;br /&gt;
        } catch (IOException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceChanged Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
        Log.v(TAG, &amp;quot;surfaceDestroyed Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
&lt;br /&gt;
        if (dialog.isShowing()) {&lt;br /&gt;
            dialog.dismiss();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        seek.setMax(convertTotime(mMediaPlayer.getDuration()));&lt;br /&gt;
        isVideoStarted = true;&lt;br /&gt;
&lt;br /&gt;
        updateSeekbarAndPlayhead();&lt;br /&gt;
        mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
&lt;br /&gt;
        setPauseAction();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void setPauseAction() {&lt;br /&gt;
        try {&lt;br /&gt;
            if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
                isVideoStarted = false;&lt;br /&gt;
                isPaused = true;&lt;br /&gt;
                mMediaPlayer.pause();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                //on video pause, updating event as pause in object&lt;br /&gt;
                data.put(&amp;quot;event&amp;quot;, &amp;quot;pause&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //sending the object to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                eventTracker.trackEvent(data);&lt;br /&gt;
&lt;br /&gt;
                btnPlay.setText(getString(R.string.play));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        releaseMediaPlayer();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void releaseMediaPlayer() {&lt;br /&gt;
        if (mMediaPlayer != null) {&lt;br /&gt;
            mMediaPlayer.release();&lt;br /&gt;
            mMediaPlayer = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onClick(View view) {&lt;br /&gt;
        switch (view.getId()) {&lt;br /&gt;
            case R.id.btnPlay:&lt;br /&gt;
                try {&lt;br /&gt;
                    //If video is not yet played, then it will play else it will pause the video&lt;br /&gt;
                    if (!isVideoStarted) {&lt;br /&gt;
&lt;br /&gt;
                        btnPlay.setText(getString(R.string.pause));&lt;br /&gt;
&lt;br /&gt;
                        if (isPaused) {&lt;br /&gt;
&lt;br /&gt;
                            isVideoStarted = true;&lt;br /&gt;
                            isPaused = false;&lt;br /&gt;
&lt;br /&gt;
                            //Once the video is resumed after pause, setting event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
                            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
                            mMediaPlayer.start();&lt;br /&gt;
&lt;br /&gt;
                        } else {&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);&lt;br /&gt;
                            mSurfaceView.setVisibility(View.VISIBLE);&lt;br /&gt;
&lt;br /&gt;
                            showProgressDialog();&lt;br /&gt;
&lt;br /&gt;
                            mSurfaceHolder = mSurfaceView.getHolder();&lt;br /&gt;
                            mSurfaceHolder.addCallback(MainActivity.this);&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    } else {&lt;br /&gt;
                        setPauseAction();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                } catch (JSONException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                } catch (Exception e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Updates seekbar&lt;br /&gt;
    private void updateSeekbarAndPlayhead() {&lt;br /&gt;
        try {&lt;br /&gt;
            //to update playhead, setting the event as &amp;quot;playhead&amp;quot;.&lt;br /&gt;
            data.put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;);&lt;br /&gt;
            playheadHandler = new Handler();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Make sure you update Seekbar on UI thread&lt;br /&gt;
            MainActivity.this.runOnUiThread(playheadRunnable = new Runnable() {&lt;br /&gt;
&lt;br /&gt;
                @Override&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    if (mMediaPlayer != null) {&lt;br /&gt;
                        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
                        seek.setProgress(mCurrentPosition);&lt;br /&gt;
                        try {&lt;br /&gt;
                            if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying()) {&lt;br /&gt;
&lt;br /&gt;
                                //updating playHead position in Object each second.&lt;br /&gt;
                                data.put(&amp;quot;playheadPosition&amp;quot;, String.valueOf(mCurrentPosition));&lt;br /&gt;
&lt;br /&gt;
                                //Sending data object to SDK with updated playHead position.&lt;br /&gt;
                                eventTracker.trackEvent(data);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (JSONException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private int convertTotime(long milliSec) {&lt;br /&gt;
&lt;br /&gt;
        int minutes = (int) (milliSec / 1000);&lt;br /&gt;
        return minutes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void showProgressDialog() {&lt;br /&gt;
&lt;br /&gt;
        runOnUiThread(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                dialog = new ProgressDialog(MainActivity.this);&lt;br /&gt;
                dialog.setCancelable(false);&lt;br /&gt;
                dialog.setMessage(getString(R.string.loading));&lt;br /&gt;
                dialog.show();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {&lt;br /&gt;
&lt;br /&gt;
        //IAppNotifier method&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3097</id>
		<title>Digital Measurement iOS Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Simplified_API&amp;diff=3097"/>
		<updated>2018-12-13T15:47:23Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for livestream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user-friendly and reducing the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the SDK. The new trackevent() API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translating new API calls to the existing Nielsen App SDK API methods. Applications which are already integrated with the existing SDK API are unaffected by this new API. &lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
In the Simplified API, one API call will be used to reference many methods. The key-value structure of this API call will provide information for proper crediting. The SDK will utilize the data received in this call and translate it into a sequence of calls linking to the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
'''Configuring Xcode Development Environment''' &lt;br /&gt;
&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.&lt;br /&gt;
&lt;br /&gt;
The SDK uses the NSURLSession instead of the deprecated NSURLConnection.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Importing Frameworks'''&amp;lt;/big&amp;gt;&lt;br /&gt;
The first step is to ensure that the following frameworks and libraries are imported into the Frameworks folder of the Xcode project before creating an instance of the Nielsen App SDK object.&lt;br /&gt;
* UIKit.framework&lt;br /&gt;
* Foundation.framework&lt;br /&gt;
* AdSupport.framework&lt;br /&gt;
* JavascriptCore.framework&lt;br /&gt;
* WebKit.framework&lt;br /&gt;
* SystemConfiguration.framework&lt;br /&gt;
* Security.framework&lt;br /&gt;
** Nielsen Analytics framework makes use of a number of functions in this library.&lt;br /&gt;
* AVFoundation.framework&lt;br /&gt;
* NielsenAppApi.framework&lt;br /&gt;
* libc++.tbd (as SDK contains Objective C++ source file)&lt;br /&gt;
** Alternatively, include -lstdc++ in Build Settings → Other Linker Flag of the Xcode project&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Example'''&lt;br /&gt;
* Extract “NielsenAppApi.Framework” from the Nielsen App SDK sample app and copy it to Frameworks folder of the Xcode project.&lt;br /&gt;
* Add the code &amp;lt;code&amp;gt;-#import NielsenAppApi/NielsenAppApi.h&amp;lt;/code&amp;gt; to the View Controller’s header file.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Ensure that the following are included in the Linked Frameworks and Libraries list (located in the project’s Summary settings).&lt;br /&gt;
* Nielsen App SDK&lt;br /&gt;
* iOS security framework&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Using Swift ===&lt;br /&gt;
To import a set of Objective-C files in the same app target as your Swift code, you rely on an Objective-C bridging header to expose those files to Swift. Xcode offers to create this header file when you add a Swift file to an existing Objective-C app, or an Objective-C file to an existing Swift app.&lt;br /&gt;
*Select File/New File/Objective-C File&lt;br /&gt;
*Xcode will prompt you to create a bridging header.&lt;br /&gt;
[[File:bridgingheader 2x.png|600px|center|link=]]&lt;br /&gt;
Once this file has been created, you need to add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Using Objective-C ===&lt;br /&gt;
Add the code &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 to the View Controller’s header file.&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerID || View ID of the UI element used as player view in application for Viewability (Future Feature) ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | Unix Timestamp&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, OTT information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if the time gap between commands exceeds 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
This event should be called at the end of each ad and is required when advertisements have the same assetId.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value as reported by video player. Unix timestamp (seconds since Jan-01-1970 UTC) for live video.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp (live):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream or unknown) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C ¹&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ² &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
¹ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
² Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1542797780&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp (seconds since Jan-01-1970 UTC)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds OTT information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;ottData&amp;quot;: {&lt;br /&gt;
   &amp;quot;ottStatus&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;ottType&amp;quot;: casting,&lt;br /&gt;
   &amp;quot;ottDevice&amp;quot;: chromecast,&lt;br /&gt;
   &amp;quot;ottDeviceID&amp;quot;: 1234&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot;content&amp;quot;, &amp;quot;ad&amp;quot;, &amp;quot;static&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; &amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK can automatically detect the change from ad to content as well as ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account, the Simplified API will support a new parameter for ad metadata: '''adIdx'''. This parameter is an index of an individual ad in a sequence of ads. Once the next ad is started the adIdx parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit); limit to 25 unique values across custom segments (segA + segB + segC) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C; limit to 25 unique values across custom segments (segA + segB + segC) || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Static_Metadata|Static Metadata Only]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Ad_Metadata|Ad Metadata Example]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#ID3_Payload|ID3 payload for DTVR]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Pause_Event|Sample Pause Event]]&lt;br /&gt;
* [[Digital_Measurement_Simplified_SDK_Supplements#Complete_Event|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
There are three primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# '''[[#OS-level_Opt-out|OS-level Opt-out]]''' - managed by ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Legacy_Opt-out|Legacy Opt-out]]''' - Direct call to SDK; used only for older versions of Nielsen iOS SDK (&amp;lt; 5.1.1.18)&lt;br /&gt;
# '''[[#App_Level_Opt_Out|App Level Opt-Out]]''' - Where [https://developer.apple.com/documentation/adsupport Ad Framework] cannot be leveraged&lt;br /&gt;
&lt;br /&gt;
=== OS-level Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS '''SDK Versions 5.1.1.18 and above'''.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== Legacy Opt-out ===&lt;br /&gt;
The ''Legacy opt-out'' method is only necessary for Nielsen iOS '''SDK versions less than 5.1.1.18'''.&lt;br /&gt;
&lt;br /&gt;
Nielsen iOS SDK 5.1.1.17 and above will check for ''OS-level opt-out'' first, if available. The user will be opted out if indicated at the OS-level '''OR''' the App-level.&lt;br /&gt;
&lt;br /&gt;
==== The legacy opt-out method works as follows: ====&lt;br /&gt;
* Get the legacy Nielsen opt-out URL via [[optOutURL]]&lt;br /&gt;
* Display a WebView element whose loadUrl is set to the value obtained from [[optOutURL]]&lt;br /&gt;
* Detect if the WebView URL changes to a special URL that indicates Opt-in, or Opt-out and close the WebView&lt;br /&gt;
** Opt-out if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://1&amp;lt;/code&amp;gt;&lt;br /&gt;
** Opt-in if the WebView URL = &amp;lt;code&amp;gt;nielsenappsdk://0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pass the detected URL to the [[userOptOut]] function&lt;br /&gt;
** Example: &amp;lt;syntaxhighlight lang=swift&amp;gt;NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;); // User opt-out&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Legacy Opt-out example code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
var webView: WKWebView!&lt;br /&gt;
var NIELSEN_URL_OPT_OUT : String = &amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
var NIELSEN_URL_OPT_IN : String = &amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
&lt;br /&gt;
       let urlStr = navigationAction.request.url?.absoluteString&lt;br /&gt;
&lt;br /&gt;
        if(urlStr == NIELSEN_URL_OPT_OUT || urlStr == NIELSEN_URL_OPT_IN){&lt;br /&gt;
            let appApi = self.nielsenApi&lt;br /&gt;
            appApi?.userOptOut(urlStr)&lt;br /&gt;
            decisionHandler(.allow)&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
           decisionHandler(.cancel)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Retrieve current Opt-Out preference ===&lt;br /&gt;
Whether the user is opted out viaOS-level Opt-out or via App-level Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&lt;br /&gt;
&lt;br /&gt;
=== Required Privacy Links ===&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html for more information&amp;quot;'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Webview Example  ====&lt;br /&gt;
The below code is an example of displaying the Nielsen Privacy page to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import UIKit&lt;br /&gt;
import WebKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class OptOutVC: UIViewController, NielsenAppApiDelegate, WKNavigationDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var webView: WKWebView!&lt;br /&gt;
    var nielsenApi: NielsenAppApi!&lt;br /&gt;
    &lt;br /&gt;
    override func loadView() {&lt;br /&gt;
        webView = WKWebView()&lt;br /&gt;
        webView.navigationDelegate = self&lt;br /&gt;
        view = webView&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: &amp;quot;new_ios_bg.png&amp;quot;)!) &lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        if let appApi = self.nielsenApi {&lt;br /&gt;
            //Getting the optPut URL from SDK&lt;br /&gt;
            if let url = URL(string: appApi.optOutURL) {&lt;br /&gt;
                webView.load(URLRequest(url: url))&lt;br /&gt;
                webView.allowsBackForwardNavigationGestures = true&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== App Level Opt Out ===&lt;br /&gt;
This is only used if the Ad Framework is not available.  The Opt-Out occurs by opening a Nielsen-defined web page and passing the user choice from the 'WebView'. In order to do this, the application needs to:&lt;br /&gt;
* Implement the UIWebView delegate method to open the Nielsen Privacy web page&lt;br /&gt;
* Capture user's selection&lt;br /&gt;
* Pass the selection back to the SDK via the &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Capture and forward user selection ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType&lt;br /&gt;
{&lt;br /&gt;
    NSString *command = [NSString stringWithFormat:@”%@”,request.URL];&lt;br /&gt;
    if ([command isEqualToString:kNielsenWebClose]) {&lt;br /&gt;
        // Close the WebView&lt;br /&gt;
        [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        return NO;&lt;br /&gt;
    }&lt;br /&gt;
    // Retrieve next URL if it’s not opt-in/out selection&lt;br /&gt;
    return (![nAppApiObject userOptOut:command]);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The app gets the user selection string via webviews shouldStartLoadWithRequest and invokes &amp;lt;code&amp;gt;userOptOut&amp;lt;/code&amp;gt; with user selection. The delegate method handles the 'WebView' URL requests, interprets the commands, and calls the SDK accordingly.&lt;br /&gt;
**&amp;lt;code&amp;gt;[nAppApiObject userOptOut:command]&amp;lt;/code&amp;gt; passes the user's selection on Nielsen Privacy page to the SDK to allow the SDK to perform the required functions.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When 'WebView' is closed, pass the status returned from 'WebView' to the SDK within the app. The App SDK manages the user's choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
The below code was built to show the functionality of the Nielsen Simplified API using a standard no-frills player.  An Advanced Player is available with the SDK Bundle.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Swift Version 4 Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKSwift.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.swift ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
//&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
&lt;br /&gt;
class SDKMethods : NSObject {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var url = NSURL(string: &amp;quot;&amp;quot;)&lt;br /&gt;
    var content : NSDictionary!&lt;br /&gt;
    &lt;br /&gt;
    //Loading Static Data&lt;br /&gt;
    func loadStatic() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
            &amp;quot;static&amp;quot; :  staticObj ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
func loadContent() -&amp;gt; [String : Any] {&lt;br /&gt;
    &lt;br /&gt;
    url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NielsenConsumer/prog_index.m3u8&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    let content = [&lt;br /&gt;
        &amp;quot;assetName&amp;quot;:&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;C77664&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;section&amp;quot;:&amp;quot;myApi_app&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;channelName&amp;quot;:&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
        &amp;quot;pipMode&amp;quot;:&amp;quot;false&amp;quot; ]&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : content,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : [String:String](),&lt;br /&gt;
        &amp;quot;static&amp;quot; :  [String:String]() ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    let data = [&lt;br /&gt;
        &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot; ] as [String : Any]&lt;br /&gt;
    &lt;br /&gt;
    return data&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ViewController.swift ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import UIKit&lt;br /&gt;
import AVKit&lt;br /&gt;
import CoreLocation&lt;br /&gt;
import AdSupport&lt;br /&gt;
import AVFoundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenEventTrackerDelegate, AVPlayerViewControllerDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var videoType : Int!&lt;br /&gt;
    var player : AVPlayer!&lt;br /&gt;
    var playerController : AVPlayerViewController!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var nielsenEventTracker : NielsenEventTracker!&lt;br /&gt;
    &lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
    var timeObserver: Any!&lt;br /&gt;
    var totalVideosPlayed = 0&lt;br /&gt;
    var totalVideos : Int!&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
        &lt;br /&gt;
        //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
        sdkMethods = SDKMethods()&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent){&lt;br /&gt;
            //loading video content data&lt;br /&gt;
            self.data = sdkMethods.loadContent()&lt;br /&gt;
        }else{&lt;br /&gt;
            //loading Ad data&lt;br /&gt;
            self.data = sdkMethods.loadPreRollAd()&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        setPlayer()&lt;br /&gt;
        setPlayHeadPosition()&lt;br /&gt;
        &lt;br /&gt;
        //Setting observer to know the completion of video&lt;br /&gt;
        setVideoFinishObserver()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {&lt;br /&gt;
        //loading static data&lt;br /&gt;
        let staticData = sdkMethods.loadStatic()&lt;br /&gt;
        &lt;br /&gt;
        //sending static data to SDK.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(staticData)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayer() {&lt;br /&gt;
        &lt;br /&gt;
        //creating player&lt;br /&gt;
        player  = AVPlayer.init(url: sdkMethods.url! as URL)&lt;br /&gt;
        playerController = AVPlayerViewController()&lt;br /&gt;
        playerController.view.frame = CGRect(x:0 , y:100, width: self.view.frame.width, height: 300)&lt;br /&gt;
        playerController.player = player;&lt;br /&gt;
        playerController.showsPlaybackControls = true;&lt;br /&gt;
        playerController.delegate = self;&lt;br /&gt;
        &lt;br /&gt;
        //Adding observer to player to track play,pause and reverse&lt;br /&gt;
        player.addObserver(self, forKeyPath: &amp;quot;rate&amp;quot;, options: NSKeyValueObservingOptions.new, context: nil)&lt;br /&gt;
        player.play()&lt;br /&gt;
        &lt;br /&gt;
        self.addChildViewController(playerController)&lt;br /&gt;
        self.view.addSubview(playerController.view)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setPlayHeadPosition() {&lt;br /&gt;
        &lt;br /&gt;
        //Setting play head position&lt;br /&gt;
        let timeInterval : CMTime = CMTimeMakeWithSeconds(1.0, 10)&lt;br /&gt;
        playerController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            &lt;br /&gt;
            let time : Float64 = self.playerController.player!.currentTime().seconds;&lt;br /&gt;
            let pos = Int64(time);&lt;br /&gt;
            let playHeadPos = String(pos)&lt;br /&gt;
            &lt;br /&gt;
            //updating playHead position in dictionary.&lt;br /&gt;
            self.data.updateValue(playHeadPos, forKey: &amp;quot;playheadPosition&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func setVideoFinishObserver() {&lt;br /&gt;
        &lt;br /&gt;
        //observer fires on completion of Video&lt;br /&gt;
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //rate 0.0 = Video Pause or stopped&lt;br /&gt;
    //rate 1.0 = Video played or resumed&lt;br /&gt;
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {&lt;br /&gt;
        if keyPath == &amp;quot;rate&amp;quot; {&lt;br /&gt;
            if let rate = change?[NSKeyValueChangeKey.newKey] as? Float {&lt;br /&gt;
                &lt;br /&gt;
                if rate == 0.0 {&lt;br /&gt;
                    print(&amp;quot;Playback stopped&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //on video pause, updating event as pause in dictionary&lt;br /&gt;
                    self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
                    self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
                }&lt;br /&gt;
                if rate == 1.0 {&lt;br /&gt;
                    print(&amp;quot;normal playback&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
                    //On Play resume setting event as Playhead&lt;br /&gt;
                    self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    override func viewDidDisappear(_ animated: Bool) {&lt;br /&gt;
        &lt;br /&gt;
        //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;pause&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        player.rate = 0&lt;br /&gt;
        player.pause()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @objc func playerDidFinishPlaying(note: NSNotification) {&lt;br /&gt;
        &lt;br /&gt;
        self.player?.removeObserver(self, forKeyPath: &amp;quot;rate&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
        totalVideosPlayed += 1&lt;br /&gt;
        &lt;br /&gt;
        if(videoType == Constants.onlyContent || totalVideosPlayed == totalVideos){&lt;br /&gt;
            //When content video completes or total videos finishs, let's send complete event to SDK&lt;br /&gt;
            sendCompleteEventToSDK()&lt;br /&gt;
        }else{&lt;br /&gt;
            //On completion of Ad updating &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            //sending &amp;quot;adStop&amp;quot; event to SDK.&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Checking if total videos played or not.&lt;br /&gt;
        if(totalVideosPlayed != totalVideos){&lt;br /&gt;
            &lt;br /&gt;
            //Checking if videoType is contentWithOneAd, then after completion of Ad, will play the content video.&lt;br /&gt;
            if(videoType == Constants.contentWithOneAd){&lt;br /&gt;
                &lt;br /&gt;
                //loading video content data&lt;br /&gt;
                self.data = sdkMethods.loadContent()&lt;br /&gt;
            }else if(videoType == Constants.contentWithTwoAds){&lt;br /&gt;
                if(totalVideosPlayed == 1){&lt;br /&gt;
                    &lt;br /&gt;
                //loading 2nd Ad data&lt;br /&gt;
                self.data = sdkMethods.loadMidRollAd()&lt;br /&gt;
                }else{&lt;br /&gt;
&lt;br /&gt;
                    //loading video content data&lt;br /&gt;
                    self.data = sdkMethods.loadContent()&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            setPlayer()&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 3), queue: DispatchQueue.main) { [weak self] time in&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                self?.handlePlayerStatus(time: time)&lt;br /&gt;
                self?.setPlayHeadPosition()&lt;br /&gt;
                &lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                self?.setVideoFinishObserver()&lt;br /&gt;
                &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func handlePlayerStatus(time: CMTime) {&lt;br /&gt;
        if player.status == .readyToPlay {&lt;br /&gt;
            &lt;br /&gt;
            // buffering is finished, setting event as Playhead&lt;br /&gt;
            self.data.updateValue(&amp;quot;playhead&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            player.removeTimeObserver(self.timeObserver)&lt;br /&gt;
        }&lt;br /&gt;
        if player.status == .unknown{&lt;br /&gt;
            print(&amp;quot;Buffering&amp;quot;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    func sendCompleteEventToSDK(){&lt;br /&gt;
        &lt;br /&gt;
        //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
        self.data.updateValue(&amp;quot;complete&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
        self.nielsenEventTracker.trackEvent(self.data)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    deinit {&lt;br /&gt;
        &lt;br /&gt;
        print(&amp;quot;Remove NotificationCenter Deinit&amp;quot;)&lt;br /&gt;
        NotificationCenter.default.removeObserver(self)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
[[File:iphonescreenshot.png|thumb]]&lt;br /&gt;
=== Objective-C Code Example ===&lt;br /&gt;
Select the below link to download the sample files &amp;lt;br&amp;gt;&lt;br /&gt;
[https://engineeringportal.nielsen.com/w/downloads/digital/sampleapplications/TrackEvent-SDKObjC.zip Download Project Files]&lt;br /&gt;
==== NielsenInit.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
//  NielsenInit.m&lt;br /&gt;
//  VideoPlayerAppObjC&lt;br /&gt;
// This is sample code of a very basic implementation of the Nielsen 'Simplified API'&lt;br /&gt;
// This code is for educational purposes only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788BC653CA&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Abdul's Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;ccode&amp;quot;: @&amp;quot;123&amp;quot;,&lt;br /&gt;
                            @&amp;quot;dma&amp;quot;:@&amp;quot;456&amp;quot;,&lt;br /&gt;
                            @&amp;quot;uoo&amp;quot;:@&amp;quot;0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NielsenInit.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //Ad data,static data should be empty in content video dictionary&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                               @&amp;quot;ad&amp;quot; : @{},&lt;br /&gt;
                               @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                           @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                           @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
                           @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Loading Ad data&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @{} };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SDKMethods.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SDKMethods : NSObject&lt;br /&gt;
&lt;br /&gt;
@property(nonatomic, strong) NSURL *url;&lt;br /&gt;
&lt;br /&gt;
- (NSDictionary *)loadContentData;&lt;br /&gt;
- (NSDictionary *)loadPreRollAd;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
#import &amp;lt;MediaPlayer/MediaPlayer.h&amp;gt;&lt;br /&gt;
#import &amp;lt;AVKit/AVKit.h&amp;gt;&lt;br /&gt;
#import &amp;quot;Constants.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NSMutableDictionary *mutableData;&lt;br /&gt;
NSDictionary *data;&lt;br /&gt;
SDKMethods *sdkMethods;&lt;br /&gt;
AVPlayer  *player;&lt;br /&gt;
AVPlayerViewController *playerController;&lt;br /&gt;
NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
int totalVideosPlayed = 0;&lt;br /&gt;
id timeObserver;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController()&amp;lt;AVPlayerViewControllerDelegate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In SDKMethods class we wrote methods which creates content,Ad objects&lt;br /&gt;
    sdkMethods = [[SDKMethods alloc] init];&lt;br /&gt;
    &lt;br /&gt;
    if(self.videoType == onlyContent){&lt;br /&gt;
        //loading video content data&lt;br /&gt;
       data = [sdkMethods loadContentData];&lt;br /&gt;
    }else{&lt;br /&gt;
        //loading Ad data&lt;br /&gt;
        data = [sdkMethods loadPreRollAd];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Converting &amp;quot;data&amp;quot; to mutable dictionary as we have to update playhead, event values.&lt;br /&gt;
    mutableData =[data mutableCopy];&lt;br /&gt;
    &lt;br /&gt;
    [self setPlayer];&lt;br /&gt;
    [self setPlayHeadPosition];&lt;br /&gt;
    &lt;br /&gt;
    //Setting observer to know the completion of video&lt;br /&gt;
    [self setVideoFinishObserver];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayer {&lt;br /&gt;
    &lt;br /&gt;
    //creating player&lt;br /&gt;
    player = [AVPlayer playerWithURL:[sdkMethods url]];&lt;br /&gt;
    playerController = [[AVPlayerViewController alloc] init];&lt;br /&gt;
    playerController.view.frame = CGRectMake(0,100,self.view.frame.size.width,300);&lt;br /&gt;
    playerController.player = player;&lt;br /&gt;
    playerController.showsPlaybackControls = YES;&lt;br /&gt;
    playerController.delegate = self;&lt;br /&gt;
    &lt;br /&gt;
    //Adding observer to player to track play,pause and reverse&lt;br /&gt;
    [player addObserver:self&lt;br /&gt;
              forKeyPath:@&amp;quot;rate&amp;quot;&lt;br /&gt;
                 options:(NSKeyValueObservingOptionNew)&lt;br /&gt;
                 context:nil];&lt;br /&gt;
    &lt;br /&gt;
    [player play];&lt;br /&gt;
    &lt;br /&gt;
    [self addChildViewController:playerController];&lt;br /&gt;
    [self.view addSubview:playerController.view];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) setVideoFinishObserver {&lt;br /&gt;
    &lt;br /&gt;
    //observer fires on completion of Ad&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerController.player.currentItem];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//rate 0.0 = Video Pause or stopped&lt;br /&gt;
//rate 1.0 = Video played or resumed&lt;br /&gt;
//rate -1.0 = Play reversed/rewind.&lt;br /&gt;
- (void)observeValueForKeyPath:(NSString *)keyPath&lt;br /&gt;
                      ofObject:(id)object&lt;br /&gt;
                        change:(NSDictionary *)change&lt;br /&gt;
                       context:(void *)context&lt;br /&gt;
{&lt;br /&gt;
    if (object == player &amp;amp;&amp;amp; [keyPath isEqualToString:@&amp;quot;rate&amp;quot;]) {&lt;br /&gt;
        NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];&lt;br /&gt;
        int intValue = newValue.intValue;&lt;br /&gt;
        if(intValue == 0){&lt;br /&gt;
            NSLog(@&amp;quot;playback paused&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //on video pause, updating event as pause in dictionary&lt;br /&gt;
            [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
            //sending the dictionary to SDK with &amp;quot;pause&amp;quot; event.&lt;br /&gt;
            [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
            &lt;br /&gt;
        }else if(intValue == 1){&lt;br /&gt;
            NSLog(@&amp;quot;Normal playback&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            //On Play resume setting event as Playhead&lt;br /&gt;
            [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidDisappear:(BOOL)animated&lt;br /&gt;
{&lt;br /&gt;
    //on moving to other screen, updating event as pause in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;pause&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a pause event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    player.rate = 0;&lt;br /&gt;
    [player pause];&lt;br /&gt;
    &lt;br /&gt;
    [super viewDidDisappear:animated];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-(void)itemDidFinishPlaying:(NSNotification *) notification {&lt;br /&gt;
    &lt;br /&gt;
    [player removeObserver:self forKeyPath:@&amp;quot;rate&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    [self sendCompleteEventToSDK];&lt;br /&gt;
    &lt;br /&gt;
    //As 1 video completed playing, incrementing the variable value.&lt;br /&gt;
    totalVideosPlayed += 1;&lt;br /&gt;
    &lt;br /&gt;
    //Checking if total videos played or not.&lt;br /&gt;
    if(totalVideosPlayed != self.totalVideos){&lt;br /&gt;
        &lt;br /&gt;
        //Checking if videoType is contentWithAd, then after completion of Ad, will play the content video.&lt;br /&gt;
        if(self.videoType == contentWithAd){&lt;br /&gt;
            &lt;br /&gt;
            //loading video content data&lt;br /&gt;
            data = [sdkMethods loadContentData];&lt;br /&gt;
            &lt;br /&gt;
            mutableData =[data mutableCopy];&lt;br /&gt;
            &lt;br /&gt;
            [self setPlayer];&lt;br /&gt;
            &lt;br /&gt;
            //Adding observer to player to check is buffering finished&lt;br /&gt;
            CMTime timeInterval = CMTimeMakeWithSeconds(1, 3);&lt;br /&gt;
            timeObserver =  [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
                &lt;br /&gt;
                //checking the video player status&lt;br /&gt;
                [self handlePlayerStatus:time];&lt;br /&gt;
                [self setPlayHeadPosition];&lt;br /&gt;
                //Setting observer to know the completion of video&lt;br /&gt;
                [self setVideoFinishObserver];&lt;br /&gt;
                &lt;br /&gt;
            }];&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) handlePlayerStatus : (CMTime) time {&lt;br /&gt;
    &lt;br /&gt;
    if(player.status == AVPlayerItemStatusReadyToPlay){&lt;br /&gt;
        &lt;br /&gt;
        // buffering is finished, setting event as Playhead&lt;br /&gt;
        [mutableData setValue:@&amp;quot;playhead&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
        [player removeTimeObserver:timeObserver];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void) sendCompleteEventToSDK {&lt;br /&gt;
    &lt;br /&gt;
    //onCompletion of video, updating event as complete in dictionary&lt;br /&gt;
    [mutableData setValue:@&amp;quot;complete&amp;quot; forKey:@&amp;quot;event&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //As it is a complete event setting the playheadPosition to empty.&lt;br /&gt;
    [mutableData setValue:@&amp;quot;&amp;quot; forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //sending the dictionary to SDK with &amp;quot;complete&amp;quot; event.&lt;br /&gt;
    [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
- (void)dealloc {&lt;br /&gt;
    NSLog(@&amp;quot;Remove NotificationCenter dealloc&amp;quot;);&lt;br /&gt;
    [[NSNotificationCenter defaultCenter] removeObserver:self];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ViewController.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@interface ViewController : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic) int videoType;&lt;br /&gt;
@property (nonatomic) int totalVideos;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.m ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC ()&lt;br /&gt;
&lt;br /&gt;
@property (weak, nonatomic) IBOutlet UIWebView *webView;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation OptOutVC&lt;br /&gt;
&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    &lt;br /&gt;
    self.nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
    &lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.nielsenEventTracker.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OptOutVC.h ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface OptOutVC : UIViewController&lt;br /&gt;
&lt;br /&gt;
@property (nonatomic, weak) NielsenEventTracker *nielsenEventTracker;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Simplified_SDK_API&amp;diff=3096</id>
		<title>Simplified SDK API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Simplified_SDK_API&amp;diff=3096"/>
		<updated>2018-12-13T15:46:44Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for livestream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI vs StandardAPI New.jpg|icon]]&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
xCode|&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
'''Configuring Xcode Development Environment''' &lt;br /&gt;
&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.&lt;br /&gt;
&lt;br /&gt;
The SDK uses the NSURLSession instead of the deprecated NSURLConnection.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Importing Frameworks'''&amp;lt;/big&amp;gt;&lt;br /&gt;
The first step is to ensure that the following frameworks and libraries are imported into the Frameworks folder of the Xcode project before creating an instance of the Nielsen App SDK object.&lt;br /&gt;
* UIKit.framework&lt;br /&gt;
* Foundation.framework&lt;br /&gt;
* AdSupport.framework&lt;br /&gt;
* JavascriptCore.framework&lt;br /&gt;
* WebKit.framework&lt;br /&gt;
* SystemConfiguration.framework&lt;br /&gt;
* Security.framework&lt;br /&gt;
** Nielsen Analytics framework makes use of a number of functions in this library.&lt;br /&gt;
* AVFoundation.framework&lt;br /&gt;
* NielsenAppApi.framework&lt;br /&gt;
* libc++.tbd (as SDK contains Objective C++ source file)&lt;br /&gt;
** Alternatively, include -lstdc++ in Build Settings → Other Linker Flag of the Xcode project&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Example'''&lt;br /&gt;
* Extract “NielsenAppApi.Framework” from the Nielsen App SDK sample app and copy it to Frameworks folder of the Xcode project.&lt;br /&gt;
* Add the code &amp;lt;code&amp;gt;-#import NielsenAppApi/NielsenAppApi.h&amp;lt;/code&amp;gt; to the View Controller’s header file.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Ensure that the following are included in the Linked Frameworks and Libraries list (located in the project’s Summary settings).&lt;br /&gt;
* Nielsen App SDK&lt;br /&gt;
* iOS security framework&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Using Swift'''&amp;lt;/big&amp;gt;&lt;br /&gt;
To import a set of Objective-C files in the same app target as your Swift code, you rely on an Objective-C bridging header to expose those files to Swift. Xcode offers to create this header file when you add a Swift file to an existing Objective-C app, or an Objective-C file to an existing Swift app.&lt;br /&gt;
&lt;br /&gt;
Select File/New File/Objective-C File  &amp;lt;br /&amp;gt;&lt;br /&gt;
Xcode will prompt you to create a bridging header.&lt;br /&gt;
[[File:bridgingheader 2x.png|600px|center]] &amp;lt;br /&amp;gt;&lt;br /&gt;
Once this file has been created, you need to add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Using Objective-C'''&amp;lt;/big&amp;gt;&lt;br /&gt;
Add the code &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 to the View Controller’s header file.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
|Android =&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerID || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android = &lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
xCode|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, UTC timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or UTC timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is UTC timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ++&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or UTC timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is UTC timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or UTC timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is UTC timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds ott information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
ottData:{&lt;br /&gt;
ottStatus:1,&lt;br /&gt;
ottType:casting,&lt;br /&gt;
ottDevice:chromecast,&lt;br /&gt;
ottDeviceName:Google ChromeCast,&lt;br /&gt;
ottDeviceID:1234,&lt;br /&gt;
ottDeviceModel:ChromeCast,&lt;br /&gt;
ottDeviceVersion:1.0.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the '''adldx value''', and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account the Nielsen Simplified API will support a new parameter for ad metadata: '''adIdx.''' This parameter is just an index of an individual ad in a sequence of ads. Once the next ad is started the '''adIdx''' parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android = &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;   &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
* [[JSON examples Simplified API|Static Metadata Only]]&lt;br /&gt;
* [[JSON examples Simplified API|Ad Metadata Example]]&lt;br /&gt;
* [[JSON examples Simplified API|ID3 payload for DTVR]]&lt;br /&gt;
* [[JSON examples Simplified API|Sample Pause Event]]&lt;br /&gt;
* [[JSON examples Simplified API|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
iOS|&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. &lt;br /&gt;
|Android= &lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
* URL to this web page should be called from SDK by invoking  userOptOutURLString() and opened in 'WebView' / External browser.&lt;br /&gt;
* If the App SDK returns NULL as Opt-Out URL, handle the exception gracefully and retry later.&lt;br /&gt;
* To retrieve the current Opt-Out status of a device, use the userOptOutURLString() method. &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;swift &amp;quot;&amp;gt;&lt;br /&gt;
public String userOptOutURLString()&lt;br /&gt;
public boolean getOptOutStatus()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Users can opt out or opt back into Nielsen Measurement through the system setting – &amp;quot;Limit Ad Tracking&amp;quot;. The setting can be accessed in the Settings application on any device. User is opted out of Nielsen online measurement research when the &amp;quot;Limit Ad Tracking&amp;quot; setting is enabled.&lt;br /&gt;
&lt;br /&gt;
To ensure GDPR compliance, Nielsen also provides the ability for a publisher to directly control the User's Opt Out status, as long as the Users has not enabled  'Limit Ad Tracking' - which will always take precedent.  This setting (optout:nielsenappsdk://1) provides app level control to ensure GDPR compliance. &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;swift &amp;quot;&amp;gt;&lt;br /&gt;
For Opt-Out: &amp;quot;optout&amp;quot;:&amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
For Opt-In:  &amp;quot;optout&amp;quot;:&amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://www.nielsen.com/digitalprivacy for more information&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
== Sample Applications ==&lt;br /&gt;
&lt;br /&gt;
The below sample applications have been designed to show the Simplified API's functionality and are broken into two distinct categories:&lt;br /&gt;
* '''Basic''' - To show the functionality of the Nielsen Simplified API using a standard no-frills player.&lt;br /&gt;
** [[Simplified SDK API-Swift4|Swift 4.0 Sample]]&lt;br /&gt;
** [[Simplified SDK API-Objective-C|Objective-C Sample]]&lt;br /&gt;
** [[Simplified SDK API-Android|Android Studio Example]]&lt;br /&gt;
&lt;br /&gt;
* '''Advanced''' - Nielsen Simplified API integrated into a custom video player.&lt;br /&gt;
** This ships with the SDK Bundle.&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Simplified_API_Supplements&amp;diff=3095</id>
		<title>Digital Measurement Simplified API Supplements</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Simplified_API_Supplements&amp;diff=3095"/>
		<updated>2018-12-13T15:45:43Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for livestream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JSON input object examples ==&lt;br /&gt;
The following are additional JSON input object examples for the Simplified API&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Sample input Object for static metadata&lt;br /&gt;
// Since only recording static data, playheadposition = &amp;quot;&amp;quot;&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {},&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;Static1&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;Page&amp;quot;,&lt;br /&gt;
         &amp;quot;segA&amp;quot;:&amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;teams&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;Atlanta&amp;quot;,&lt;br /&gt;
         &amp;quot;crossId1&amp;quot;:&amp;quot;Reference&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;ottData&amp;quot;: {},&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input object for playhead event with ad metadata&lt;br /&gt;
// Note: Content metadata must be also set for &amp;quot;playhead&amp;quot; event with &amp;quot;ad&amp;quot; type.&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: { &lt;br /&gt;
         &amp;quot;assetName&amp;quot;:&amp;quot;MyTest789&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;BIG_BUNNY&amp;quot;,&lt;br /&gt;
         &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
         &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
         &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
         &amp;quot;airdate&amp;quot;:&amp;quot;2016-02-20&amp;quot;,&lt;br /&gt;
         &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
     &amp;quot;ad&amp;quot;: {&lt;br /&gt;
        &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;static&amp;quot;: {}&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ID3 Payload ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input object for playhead event with id3 payload&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
         &amp;quot;length&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
         &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: {}&lt;br /&gt;
    },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
      EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
      2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
      JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
      uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pause Event ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input object for pause event&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: { &lt;br /&gt;
         &amp;quot;assetName&amp;quot;:&amp;quot;MyTest789&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;BIG_BUNNY&amp;quot;,&lt;br /&gt;
         &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
         &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
         &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
         &amp;quot;airdate&amp;quot;:&amp;quot;2016-02-20&amp;quot;,&lt;br /&gt;
         &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: {}&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;pause&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;id3Data&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complete Event ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input object for complete event:&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: { &lt;br /&gt;
         &amp;quot;assetName&amp;quot;:&amp;quot;MyTest789&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;BIG_BUNNY&amp;quot;,&lt;br /&gt;
         &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
         &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
         &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
         &amp;quot;airdate&amp;quot;:&amp;quot;2016-02-20&amp;quot;,&lt;br /&gt;
         &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: {}&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;complete&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;id3Data&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom values ===&lt;br /&gt;
==== id3 and ott ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
// The follow input objects are for custom/advanced implementations&lt;br /&gt;
// Not required.&lt;br /&gt;
&lt;br /&gt;
// Sample input object for playhead event with id3 payload and ottInfo:&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: { &lt;br /&gt;
         &amp;quot;assetName&amp;quot;:&amp;quot;MyTest789&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;BIG_BUNNY&amp;quot;,&lt;br /&gt;
         &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
         &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
         &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
         &amp;quot;airdate&amp;quot;:&amp;quot;2016-02-20&amp;quot;,&lt;br /&gt;
         &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: {}&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;ottData&amp;quot;:{ &lt;br /&gt;
      &amp;quot;ottStatus&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
      &amp;quot;ottTSPlype&amp;quot;:&amp;quot;casting&amp;quot;,&lt;br /&gt;
      &amp;quot;ottDevice&amp;quot;:&amp;quot;chromecast&amp;quot;,&lt;br /&gt;
      &amp;quot;ottDeviceName&amp;quot;:&amp;quot;Google ChromeCast&amp;quot;,&lt;br /&gt;
      &amp;quot;ottDeviceID&amp;quot;:&amp;quot;1234&amp;quot;,&lt;br /&gt;
      &amp;quot;ottDeviceModel&amp;quot;:&amp;quot;ChromeCast&amp;quot;,&lt;br /&gt;
      &amp;quot;ottDeviceVersion&amp;quot;:&amp;quot;1.0.0&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
      EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
      2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
      JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
      uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mDAR/OCR ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
// Sample mDAR/OCR input object for playhead event and ad type:&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: { &lt;br /&gt;
         &amp;quot;assetName&amp;quot;:&amp;quot;MyTest789&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;BIG_BUNNY&amp;quot;,&lt;br /&gt;
         &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
         &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
         &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
         &amp;quot;airdate&amp;quot;:&amp;quot;2016-02-20&amp;quot;,&lt;br /&gt;
         &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;ad-21&amp;quot;,&lt;br /&gt;
         &amp;quot;nol_ocrtag&amp;quot;:&amp;quot;https:\/\/secure-qat2.imrworldwide.com\/cgi-bin\/m?ci=nlsnci535&amp;amp;am=3&amp;amp;at=view&amp;amp;rt=banner&lt;br /&gt;
            &amp;amp;st=image&amp;amp;ca=nlsn12452&amp;amp;cr=crtve&amp;amp;pc=spotify_plc0001&amp;amp;ce=spotify&amp;amp;r=1065684265&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;static&amp;quot;: {}&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==== Radio Player ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
// Sample radio player input object for playhead event:&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
         &amp;quot;dataSrc&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;radio&amp;quot;,&lt;br /&gt;
         &amp;quot;stationType&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;: &amp;quot;WXYZ-FM&amp;quot;,&lt;br /&gt;
         &amp;quot;provider&amp;quot;: &amp;quot;MyRadioProvider&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: {}&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;1502704743&amp;quot;,&lt;br /&gt;
   &amp;quot;id3Data&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Browser_Simplified_API&amp;diff=3094</id>
		<title>Digital Measurement Browser Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Browser_Simplified_API&amp;diff=3094"/>
		<updated>2018-12-13T15:45:12Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for livestream, changed &amp;quot;live stream&amp;quot; to &amp;quot;livestream&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the Simplified SDK for Browser, you will need an '''Appid.'''  This is a Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have an AppID , please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
[http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg Click here to zoom in on image]&lt;br /&gt;
== Manages the order of metadata (ad vs content and playheads) ==&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
== Everything passed via trackevent() ==&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  // Add Static Queue Snippet&lt;br /&gt;
 !function(t,n)&lt;br /&gt;
 {&lt;br /&gt;
   t[n]=t[n]||{nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
   {&lt;br /&gt;
    return s=t.document,&lt;br /&gt;
    r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
    r.async=1,&lt;br /&gt;
    r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
    i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
    i.parentNode.insertBefore(r,i),&lt;br /&gt;
    t[o]=t[o]||{g:c,ggPM:function(n,e,c,r,s){(t[o].q=t[o].q||[]).push([n,e,c,r,s])}},&lt;br /&gt;
    t[o]&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
} &lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
=== Create SDK Instance ===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three variables:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Description !! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid || Unique ID assigned to player/site. || &amp;lt;code&amp;gt;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || Any string value&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug: &amp;quot;debug&amp;quot; || Enables Nielsen console logging. Only required for testing || &amp;lt;code&amp;gt;{nol_sdkDebug: &amp;quot;debug&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;code&amp;gt;&amp;lt;apid&amp;gt;.js&amp;lt;/code&amp;gt;, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: &amp;quot;nlsSDK600.bundle.min.js&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  // Add Static Queue Snippet&lt;br /&gt;
 !function(t,n)&lt;br /&gt;
 {&lt;br /&gt;
   t[n]=t[n]||{nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
   {&lt;br /&gt;
    return s=t.document,&lt;br /&gt;
    r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
    r.async=1,&lt;br /&gt;
    r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
    i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
    i.parentNode.insertBefore(r,i),&lt;br /&gt;
    t[o]=t[o]||{g:c,ggPM:function(n,e,c,r,s){(t[o].q=t[o].q||[]).push([n,e,c,r,s])}},&lt;br /&gt;
    t[o]&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
} &lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp (seconds since Jan-1-1970 UTC) or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for livestream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ++&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds ott information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
ottData:{&lt;br /&gt;
ottStatus:1,&lt;br /&gt;
ottType:casting,&lt;br /&gt;
ottDevice:chromecast,&lt;br /&gt;
ottDeviceName:Google ChromeCast,&lt;br /&gt;
ottDeviceID:1234,&lt;br /&gt;
ottDeviceModel:ChromeCast,&lt;br /&gt;
ottDeviceVersion:1.0.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (86400 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;86400&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the '''adldx value''', and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account the Nielsen Simplified API will support a new parameter for ad metadata: '''adIdx.''' This parameter is just an index of an individual ad in a sequence of ads. Once the next ad is started the '''adIdx''' parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Opt-Out ==&lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into, Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the opt-out option, include the following two items in your privacy policy&lt;br /&gt;
* A notice that the player includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings)&lt;br /&gt;
* A link to the Nielsen Digital Measurement Privacy Policy at http://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click Choices to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen online measurement, click a link to receive an opt-out cookie.&lt;br /&gt;
&lt;br /&gt;
The following paragraph is a template for an opt-out statement, the properties may feature Nielsen proprietary measurement software, which will allow users to contribute to market research, such as Nielsen TV Ratings. To learn more about the information that Nielsen software may collect and your choices with regard to it, please see the Nielsen Digital Measurement Privacy Policy at http://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html.&lt;br /&gt;
&lt;br /&gt;
=== Opt Back In ===&lt;br /&gt;
Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, their opt-out cookie will be deleted and they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
Once the DCR Tracking Code is added to Instant Articles, Nielsen will validate the implementation. Following Nielsen testing, users need to make a couple of updates to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
# '''App ID''': Ensure that correct &amp;lt;apid&amp;gt; is used during initialization&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# '''Debug Logging''': Disable logging by deleting &amp;lt;code&amp;gt;{nol_sdkDebug: 'DEBUG'}&amp;lt;/code&amp;gt; from initialization call.&lt;br /&gt;
#* '''Example Production Initialization Call''' - Refer to the production initialization call below:&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;);&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Norway_Audio_Browser_SDK&amp;diff=3093</id>
		<title>DCR Norway Audio Browser SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Norway_Audio_Browser_SDK&amp;diff=3093"/>
		<updated>2018-12-13T15:44:28Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for livestream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand audio and video streaming using mobile devices, desktop browser, TV, etc.&lt;br /&gt;
The Browser SDK is the framework for browsers developers to integrate Nielsen Measurement into their media player pages. It supports a variety of Nielsen Measurement Products like Digital Content Ratings, Digital in TV Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR). Nielsen SDKs are also equipped to measure static content and can track key life cycle events of pages like:&lt;br /&gt;
*Site launch events and how long page is viewed&lt;br /&gt;
*Time of viewing a sub section / page.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an AppID is needed. The AppID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration from Nielsen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  apid: &amp;quot;XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot; // eg. PDA7D5EE6-B1B8-XXXX-XXXX-2A788BCXXXCA&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
=== Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing (not in production) || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.eu.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique AppID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  // Add Static Queue Snippet&lt;br /&gt;
 !function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
 var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;P14273221-CF5C-46BF-A832-994AEFB73AA4&amp;quot;,&amp;quot;myPlayerName&amp;quot;, {nol_sdkDebug: &amp;quot;DEBUG&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create Metadata Objects ===&lt;br /&gt;
There are two types of asset metadata:&lt;br /&gt;
*content: identify content stream&lt;br /&gt;
*ad: identify each ad&lt;br /&gt;
&lt;br /&gt;
The metadata received for each asset is used for classification and reporting.&lt;br /&gt;
&lt;br /&gt;
Metadata can be passed through key-values using the Nielsen reserved keys. User will need to set up content and ad objects with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
&lt;br /&gt;
==== Content Metadata ====&lt;br /&gt;
Content metadata should remain constant throughout the completion of an episode / clip including the ads play.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required/Obligatory&lt;br /&gt;
|-&lt;br /&gt;
| type || type of asset || &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; || ✓&lt;br /&gt;
|-&lt;br /&gt;
| isAudio || indicate measurement of audio ads or audio content || &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; || ✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset (64 character limit)|| custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| program ||(string) name of program (254 character limit) || custom || ✓&lt;br /&gt;
|-&lt;br /&gt;
| title ||(string) episode title (max 254 characters) || custom || ✓&lt;br /&gt;
|-&lt;br /&gt;
| length || length of content in seconds || &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; ('0' for 24/7 Livestream if only one assetid is used for the whole stream. If reporting on program level, length of the program. ) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| airdate || the airdate in the linear over-the-air broadcast || Supported formats are:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
&lt;br /&gt;
YYYY-MM-DDHH:MI:SS&lt;br /&gt;
&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS+xx:xx&lt;br /&gt;
&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS-xx:xx&lt;br /&gt;
&lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
&lt;br /&gt;
MM/DD/YYYY&lt;br /&gt;
|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| scheduledEndDate || the airdate when this particular asset ended in the linear over-the-air broadcast || should be same format as airdate || ✓&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || full episode flag || &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode || ✓&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || type of ad load:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt; Linear – matches over-the-air ad load&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
|| &amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; - DCR measures content with dynamic ads || ✓&lt;br /&gt;
|-&lt;br /&gt;
| stationType	|| OTA station flag and/or OTA station type&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt; Custom station built per user&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt; OTA streaming station with the same adload&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; OTA station with a different ad load&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;3&amp;quot;&amp;lt;/code&amp;gt; Multicast eRadio or online station&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;4&amp;quot;&amp;lt;/code&amp;gt; On Demand Audio(podcasting)	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|-&lt;br /&gt;
| stationId	|| (string) name of the channel || custom||✓&lt;br /&gt;
|-&lt;br /&gt;
| clientid	|| &lt;br /&gt;
parent ID – value is automatically populated through provided App ID.&amp;lt;br/&amp;gt;&lt;br /&gt;
In order to override the brand configured to the App ID, pass parent &amp;lt;br/&amp;gt;&lt;br /&gt;
value here and the sub-brand ID associated to that brand in the subbrand &amp;lt;br/&amp;gt;&lt;br /&gt;
key (e.g. multiple brands in App)	&lt;br /&gt;
||&lt;br /&gt;
provided by Nielsen	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| subbrand	|| vcid/sub-brand ID – value is automatically populated through provided&amp;lt;br/&amp;gt;&lt;br /&gt;
App ID. In order to override the sub-brand configured to the App ID, value can &amp;lt;br/&amp;gt;&lt;br /&gt;
be passed here (e.g. multiple sub-brands in App). clientId does not need to be provided.&lt;br /&gt;
||&lt;br /&gt;
provided by Nielsen	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| progen	|| (string) genre information (max 254 characters) &lt;br /&gt;
||&lt;br /&gt;
custom	&lt;br /&gt;
||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example Content Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var content_metadata_object = {  &lt;br /&gt;
  // SDK&lt;br /&gt;
  type:     'content',&lt;br /&gt;
  isAudio:  'true',&lt;br /&gt;
  assetid:  'VID123-123456',&lt;br /&gt;
  program:  'program name',&lt;br /&gt;
  title:    'episode title',&lt;br /&gt;
  length:   '543',&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Object ===&lt;br /&gt;
The ad metadata should be passed for each individual ad.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Ad Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var adMetadataObject = &lt;br /&gt;
{  &lt;br /&gt;
  assetid: 'AD-1',&lt;br /&gt;
  type:    'preroll'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt; URL Character Limit: There is a URL character limit of 2K characters due to browser limitations. Exceeding this value could impair data delivery on particular browsers. &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avoid Carriage Return (CR) and/or Linefeeds (LF) in all fields (because of current data reporting as CSV)!&lt;br /&gt;
Implementations has to filter out CR/LF with appropriate programming.&lt;br /&gt;
It's also a good idea to check and validate entries from other systems (eg. CMS, player) before simply copy them to the variables in metadata.&lt;br /&gt;
&lt;br /&gt;
== Interrupt Scenarios ==&lt;br /&gt;
&lt;br /&gt;
=== Pause Event ===&lt;br /&gt;
To indicate pause&lt;br /&gt;
&lt;br /&gt;
* Call [[stop]] immediately and withhold sending playhead position.&lt;br /&gt;
* Start sending pings – [[loadMetadata]] and [[playheadPosition]] - once the playback resumes.&lt;br /&gt;
&lt;br /&gt;
=== Other Interrupt Scenarios ===&lt;br /&gt;
The following possible browser interruption scenarios must be handled:&lt;br /&gt;
&lt;br /&gt;
* Browser/Tab close&lt;br /&gt;
* Leaving the page to another destination&lt;br /&gt;
* Pressing the stop button&lt;br /&gt;
&lt;br /&gt;
There are many cases where the player itself has the ability to detect such situations. If not, these interruption scenarios can be handled through JavaScript. The events that are called will depend on the asset being played (e.g. midroll vs. content).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var stopped = false;&lt;br /&gt;
function closePlayer() {&lt;br /&gt;
	if (stopped) {return;}&lt;br /&gt;
	stopped = true;&lt;br /&gt;
	if (inMidroll) {    // Only inside a midroll indicate &amp;lt;stop&amp;gt; for the ad&lt;br /&gt;
		nSdkInstance.ggPM('stop', playheadPositionMidroll);&lt;br /&gt;
	}&lt;br /&gt;
	nSdkInstance.ggPM('end', playheadPositionContent);    // Indicate &amp;lt;end&amp;gt; for the content&lt;br /&gt;
};&lt;br /&gt;
window.addEventListener(&amp;quot;beforeunload&amp;quot;, function (e) {&lt;br /&gt;
	closePlayer();   // call nielsensdk with end/stop&lt;br /&gt;
});&lt;br /&gt;
window.addEventListener(&amp;quot;pagehide&amp;quot;, function (e) {	// for iOS mobile &amp;quot;pagehide&amp;quot; recommended by apple&lt;br /&gt;
	closePlayer();   // call nielsensdk with end/stop&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' User may need to add code to support specific browser versions (e.g. older versions of Internet Explorer or covering Safari on mobile browsers ... you may use &amp;quot;onpagehide&amp;quot; event as well).&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Call Nielsen APIs ==&lt;br /&gt;
The method for calling events is ggPM().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM('event', parameter);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Events ===&lt;br /&gt;
The events are included in the table below:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event name !! Values to pass !!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each content/ad metadata object&lt;br /&gt;
|-&lt;br /&gt;
| 'setPlayheadPosition'&lt;br /&gt;
||&lt;br /&gt;
*&amp;quot;on-demoand (or ad ): || current position in seconds (integer) &amp;lt;br/&amp;gt;&lt;br /&gt;
*&amp;quot;Live: current UTC timestamp (seconds since January 1st 1970)&amp;lt;br/&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' ||	playhead position in seconds	|| Call when ads complete playing and at the very end of the stream. The playhead position must be passed when calling stop&lt;br /&gt;
|-&lt;br /&gt;
| 'end'	|| playhead position in seconds	|| This event has to be called once for the current asset at the end of the playback.&lt;br /&gt;
At the end of the content stream, if the user switches to another piece of content or when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Playhead position as integer&lt;br /&gt;
&lt;br /&gt;
'''Note:''' 'setPlayheadPosition' has to be called every second&lt;br /&gt;
&lt;br /&gt;
==== Example Events ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Event:''' loadMetadata  |  '''Value Pass ( Object ):''' Content Metadata Object&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  nSdkInstance.ggPM('loadMetadata', contentMetadataObject); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Event:''' loadMetadata  |  '''Value Pass  ( Object ):''' Pre-roll AD Metadata Object&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  nSdkInstance.ggPM('loadMetadata', prerollMetadataObject); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Event:''' setPlayheadPosition  |  '''Value Pass ( Integer ):''' playheadPosition&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  nSdkInstance.ggPM('setPlayheadPosition', playheadPosition); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Event:''' stop  |  '''Value Pass ( Integer ):''' stopPlayheadPosition &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  nSdkInstance.ggPM('stop', stopPlayheadPosition); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Event:''' end  |  '''Value Pass ( Integer ):''' endPlayheadPosition &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  nSdkInstance.ggPM('end', endPlayheadPosition); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  SDK Event Lifecycle ==&lt;br /&gt;
&lt;br /&gt;
The sample event lifecycle can be used as a reference for identifying the order for calling events.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Examples|&lt;br /&gt;
without Ads|&lt;br /&gt;
&lt;br /&gt;
==== Event Lifecycle without ads: ====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:even browser no ads.png]]&lt;br /&gt;
&lt;br /&gt;
==== Example without ads: ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// START OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);  // must be called as start of stream&lt;br /&gt;
&lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);  // must be fired every second with playhead starting from 0 (or with seconds since 1970-01-01 00:00:00 in case of livestream)&lt;br /&gt;
&lt;br /&gt;
... /*** pass playheads every second ***/&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', lastPlayheadPosition);&lt;br /&gt;
// END OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('end', endPlayheadPosition);  // has to be called here at the end of the content&lt;br /&gt;
// endPlayheadPosition = lastPlayheadPosition&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|with Ads=&lt;br /&gt;
&lt;br /&gt;
==== Event Lifecycle with ads: ====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:event browser.png|event browser.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example with ads: ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// START OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject); // must be called as start of stream (even if 1st asset is preroll)&lt;br /&gt;
 &lt;br /&gt;
// PREROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', prerollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition); // must be fired every second with playhead starting from 0&lt;br /&gt;
&lt;br /&gt;
... /*** pass playhead every second ***/&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', lastPlayheadPosition);  // end pre-roll stream&lt;br /&gt;
nSdkInstance.ggPM('stop', stopPlayheadPosition);  // stopPlayheadPosition = lastPlayheadPosition&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);  // must be fired every second with playhead starting from 0 for the first segment (or with seconds since 1970-01-01 00:00:00 in case of livestream)&lt;br /&gt;
&lt;br /&gt;
... /*** pass playhead every second ***/&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
&lt;br /&gt;
// MIDROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', midrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition); // must be fired every second with playhead starting from 0&lt;br /&gt;
&lt;br /&gt;
... /*** pass playhead every second ***/&lt;br /&gt;
  &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', lastPlayheadPosition);  // end mid-roll stream&lt;br /&gt;
nSdkInstance.ggPM('stop', stopPlayheadPosition);  // stopPlayheadPosition = lastPlayheadPosition&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition); // must be fired every second with playhead starting from where it left off before mid-roll (or with seconds since 1970-01-01 00:00:00 in case of livestream)&lt;br /&gt;
&lt;br /&gt;
... /*** pass playhead every second ***/&lt;br /&gt;
 &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', lastPlayheadPosition); &lt;br /&gt;
nSdkInstance.ggPM('end', endPlayheadPosition);  // has to be called here at the end of the content&lt;br /&gt;
// endPlayheadPosition = lastPlayheadPosition&lt;br /&gt;
 &lt;br /&gt;
// POSTROLL&lt;br /&gt;
nSdkInstance.ggPM('loadmetadata', postrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);  // must be fired every second with playhead starting from 0&lt;br /&gt;
&lt;br /&gt;
... /*** pass playhead every second ***/&lt;br /&gt;
 &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', lastPlayheadPosition); // end post-roll stream&lt;br /&gt;
// END OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('stop', stopPlayheadPosition);  // stopPlayheadPosition = lastPlayheadPosition&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* 'setPlayheadPosition' is used for calculating duration and must be passed every second. The final playhead position must be sent for the current asset being played before calling 'stop', 'end', or 'loadmetadata'.&lt;br /&gt;
&lt;br /&gt;
* after an 'end' in case there is a new content played, there is a need to have another 'loadmetadata' again.&lt;br /&gt;
&lt;br /&gt;
* For Ad, events must be called for each individual Ad. Each Ad playhead position should begin at ‘0’ when ad starts.&lt;br /&gt;
&lt;br /&gt;
* When content has resumed following an ad break, the playhead position update must continue where previous content segment left off. The playhead position should be passed as a rounded number with no decimals.&lt;br /&gt;
&lt;br /&gt;
* For pre-roll ads you have to call the loadMetadata event for content at the start of stream and after the preroll&lt;br /&gt;
&lt;br /&gt;
== Nielsen Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into, Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the opt-out option, include the following two items in your privacy policy.&lt;br /&gt;
* A notice that the player includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings).&lt;br /&gt;
* A link to the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html.&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click &amp;quot;Choices&amp;quot; to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen Online Measurement, click a link to receive an opt-out cookie.&lt;br /&gt;
&lt;br /&gt;
The following paragraph is a template for an opt-out statement.&lt;br /&gt;
&lt;br /&gt;
''The properties may feature Nielsen proprietary measurement software, which will allow users to contribute to market research, such as Nielsen TV Ratings. To learn more about the information that Nielsen software may collect and your choices with regard to it, please see the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html.''&lt;br /&gt;
&lt;br /&gt;
====Opt Back In====&lt;br /&gt;
&lt;br /&gt;
Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, their opt-out cookie will be deleted and they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
Following Nielsen testing, users need to make a couple of updates to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
# '''Debug Logging''': Disable logging by deleting &amp;lt;code&amp;gt;{nol_sdkDebug: 'debug'}&amp;lt;/code&amp;gt; from initialization call.&lt;br /&gt;
&lt;br /&gt;
====Example Production Initialization Call ====&lt;br /&gt;
Refer to the production initialization call below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;P14273221-CF5C-46BF-A832-994AEFB73AA4&amp;quot;, &amp;quot;myPlayerName&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note''': before going live you have to inform Nielsen - this is necessary, because Nielsen team has to adjust internal configuration parameter to enable data collection. Without that notification no data will be collected and no data will be reported.&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Brightcove_Plugin_Browser&amp;diff=3092</id>
		<title>Brightcove Plugin Browser</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Brightcove_Plugin_Browser&amp;diff=3092"/>
		<updated>2018-12-13T15:43:44Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for livestream, changed &amp;quot;live stream&amp;quot; to &amp;quot;livestream&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
The Nielsen Browser SDK (Software Development Kit) is the Nielsen framework for measuring media consumption in browser environments.&lt;br /&gt;
&lt;br /&gt;
{{PluginInfobox&lt;br /&gt;
|pluginImage=BrightcoveIcon&lt;br /&gt;
|osImage=BrowserIcon&lt;br /&gt;
|playerVersion=5.17, 5.22.2 - 5.27.0 &amp;amp; 6.10.1&lt;br /&gt;
|SDKVersion=6.0.0.28&lt;br /&gt;
|supportedAdFrameworks=&lt;br /&gt;
}}.&lt;br /&gt;
&lt;br /&gt;
This SDK has the following features:&lt;br /&gt;
* '''Multiple product support''': built-in capabilities to support Digital Content Ratings(DCR), VideoCensus(VC), Digital Program Ratings(DPR) and IAG.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''':  The Brightcove Plugin 5.1.0.10 is compatible with the Brightcove V5 player version 5.17, 5.22.2 and Brightcove V6 player version 6.10.1. Brightcove V5 player 5.18 through 5.22.0 should not be used with the version 5.1.0.10 of the plugin.&lt;br /&gt;
&lt;br /&gt;
All of the player issues that would have impacted measurement have been fixed in 5.22.2. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
=== What You Will Need? ===&lt;br /&gt;
* '''Nielsen App ID (apid)''': a Unique ID that Nielsen assigns to the site / player. The 'apid' will be provided by your Technical Account Manager.&lt;br /&gt;
* '''BrightCove Plugin''': Plugin URLs are provided in the below [[#URL|section]].&lt;br /&gt;
* '''Test Environment Validation''': before you move into production, Nielsen must validate the SDK integration in a test environment.&lt;br /&gt;
&lt;br /&gt;
=== Initial Configuration ===&lt;br /&gt;
Before integrating the plugin, configure the metadata, obtain Nielsen APID's, and review the Nielsen plugin URLs for Brightcove.&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen apid is required to enable SDK functionality. Your Technical Account Manager will provide two apids for each player configuration&lt;br /&gt;
* Test apid: use this apid during development and testing&lt;br /&gt;
* Production apid: use this apid in your production environment after Nielsen has tested and qualified the player.&lt;br /&gt;
&lt;br /&gt;
=== Brightcove Plugin URL's ===&lt;br /&gt;
* BC Perform Player (JS)&lt;br /&gt;
** http://cdn-gl.imrworldwide.com/novms/bc/3/ggng510.js&lt;br /&gt;
** https://cdn-gl.imrworldwide.com/novms/bc/3/ggng510.js&lt;br /&gt;
&lt;br /&gt;
=== Global Parameters ===&lt;br /&gt;
To initialize the Nielsen Browser SDK, pass one global parameter when adding the BC Perform plugin.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid || Unique ID assigned to player/site. There are two IDs provided || &amp;lt;code&amp;gt;'XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/code&amp;gt;&lt;br /&gt;
* Test: begins with 'T' and is used for testing&lt;br /&gt;
* Production: begins with 'P' and is used in live environment when testing and certification is completed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The below parameter is optional but recommended when testing implementation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Nielsen SDK console logging that should be used while testing. Make sure to disable before moving the implementation to production. || &amp;lt;code&amp;gt;'INFO'&amp;lt;/code&amp;gt; – API calls&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'WARNING'&amp;lt;/code&amp;gt; – System level logs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'ERROR'&amp;lt;/code&amp;gt; – Error logs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'DEBUG'&amp;lt;/code&amp;gt; – Full logs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure Metadata ===&lt;br /&gt;
There are two types of metadata&lt;br /&gt;
* '''DCR Content Metadata''': identify content&lt;br /&gt;
* '''DCR Ad Metadata''': identify ad&lt;br /&gt;
Metadata can be passed through key-values using the Nielsen reserved keys.&lt;br /&gt;
&lt;br /&gt;
The metadata received for each asset is used for classification and reporting. There are reserved Nielsen keys for collecting the required metadata.&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Type !! Required&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset || &amp;lt;code&amp;gt;'content'&amp;lt;/code&amp;gt; || string || Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID assigned to asset || custom (no [[Special Characters]]) || string || Yes&lt;br /&gt;
|-&lt;br /&gt;
| program || Program Name || &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; || string || Yes&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title || &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; || string || Yes&lt;br /&gt;
|-&lt;br /&gt;
| airdate || The original airdate for linear TV || &amp;lt;code&amp;gt;'20161013 20:00:00'&amp;lt;/code&amp;gt; || date || No&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || &amp;lt;code&amp;gt;3600&amp;lt;/code&amp;gt; (0 for live stream)|| integer || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom Reporting Segment || &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; || string || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom Reporting Segment || &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; || string || No&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full Episode Flag ||&lt;br /&gt;
&amp;lt;code&amp;gt;'y'&amp;lt;/code&amp;gt; - Full Episode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'n'&amp;lt;/code&amp;gt; - Non Full Episode &lt;br /&gt;
|| boolean || Yes&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Distinguishes Dynamic vs Linear Ad Insertion ||&lt;br /&gt;
&amp;lt;code&amp;gt;'1'&amp;lt;/code&amp;gt; - Linear&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'2'&amp;lt;/code&amp;gt; - Dynamic&lt;br /&gt;
|| integer || Yes&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard Episode ID || &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; || string || Yes&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content Originator ID || &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; || string || No&lt;br /&gt;
|-&lt;br /&gt;
| mediaURL || URL location of the content being streamed || &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; || string || Yes&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Distinguishes when content includes Ads ||&lt;br /&gt;
&amp;lt;code&amp;gt;'0'&amp;lt;/code&amp;gt; - No Ads&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'1'&amp;lt;/code&amp;gt; - Includes Ads&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'2'&amp;lt;/code&amp;gt; - Unknown&lt;br /&gt;
|| integer || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Type !! Required&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of ad ||&lt;br /&gt;
&amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'midroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'postroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|| string || Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID assigned to ad || &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; || string || Yes&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''':There is a URL character limit of 2000 characters imposed due to browser limitations. Exceeding this value can impair data delivery on particular browsers.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
In order to integrate the Nielsen plugin, follow the steps for setting up these players in the Brightcove user interface as they appear below by each player type.&lt;br /&gt;
&lt;br /&gt;
=== Brightcove Player Setup ===&lt;br /&gt;
The new Brightcove Perform player allows two interchangeable ways to add the plugin: on the web site, so the player will come already configured, and programmatically on the client side.&lt;br /&gt;
&lt;br /&gt;
These options, as well as the whole process of adding a plugin is common to the player and described here http://support.brightcove.com/en/perform/docs/configuring-player-plugins&lt;br /&gt;
&lt;br /&gt;
==== For Nielsen SDK plugin, the integrator would need ====&lt;br /&gt;
* A list of initialization parameters - required (Application ID) and optional ones. Refer to [[#Global Parameters|Global Parameters]] section above.&lt;br /&gt;
* A link (URL) to SDK plugin (ggng510.js) for Brightcove&lt;br /&gt;
* A list of metadata fields with their names (Nielsen Key Mapping) to pass to the plugin. For more information, refer to [[#Configure Metadata|Configure Metadata]] section.&lt;br /&gt;
* Access to the Brightcove VideoCloud Perform Portal https://studio.brightcove.com/products/videocloud/home&lt;br /&gt;
&lt;br /&gt;
==== To add Nielsen SDK plugin using UI do the following ====&lt;br /&gt;
Open Brightcove VideoCloud portal, open players list and open (or create) a player the plugin should be added to.&lt;br /&gt;
Scroll down to the 'Plugins' section in player configuration&lt;br /&gt;
&lt;br /&gt;
[[File:Plugins-BC.jpg|link=]]&lt;br /&gt;
&lt;br /&gt;
* Click &amp;quot;Edit&amp;quot; and enter the URL to plugin JS file. Click &amp;quot;+&amp;quot; to add the row.&lt;br /&gt;
&lt;br /&gt;
[[File:js-BC.jpg|link=]]&lt;br /&gt;
&lt;br /&gt;
* Then click &amp;quot;Name, Options (JSON)&amp;quot; row and enter &amp;quot;NielsenBC&amp;quot; for the plugin name and required initialization parameters provided by your Nielsen Technical Account Manager, as below:&lt;br /&gt;
&lt;br /&gt;
[[File:Js-BC2.jpg|link=]]&lt;br /&gt;
&lt;br /&gt;
Example Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
  &amp;quot;nol_sdkDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
  &amp;quot;apid&amp;quot;: &amp;quot;T4BFBFAC9-XXXX-XXXX-XXXX-22B092CBCC2B&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding &amp;lt;code&amp;gt;&amp;quot;nol_sdkDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&amp;lt;/code&amp;gt; will allow SDK events in the console.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': &amp;lt;code&amp;gt;&amp;quot;nol_sdkDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&amp;lt;/code&amp;gt; must be removed when moving a player live to production to disable the debug logging.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Pass Content &amp;amp; Ad Metadata to The Brightcove Video Player ====&lt;br /&gt;
Pass the required content, and ad metadata to the Brightcove video player so that the Nielsen Plug-In is able to pick it up in order to populate the DCR crediting tags. The Nielsen Plug-In is preconfigured to automatically obtain metadata from Custom Fields. These can be set through the Brightcove User Interface (under ADMIN) or programmatically.&lt;br /&gt;
&lt;br /&gt;
Information on creating Custom Metadatafields can be found on the [https://support.brightcove.com/en/video-cloud/docs/creating-custom-metadata-fields|Brightcove Support site].&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' If you are using the Brightcove player with the PERFORM service, you will need to populate the media info. Please contact Brightcove support for details on this process.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Video-Fields.jpg|link=]]&lt;br /&gt;
&lt;br /&gt;
For more information on how to pass the required metadata to the Brightcove [https://www.brightcove.com/en/online-video-platform VideoCloud] player, please reach out to your Brightcove Account Manager for further assistance.&lt;br /&gt;
&lt;br /&gt;
==== To add Nielsen SDK programmatically ====&lt;br /&gt;
* Include plugin source&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script src=&amp;quot;//cdn-gl.imrworldwide.com/novms/bc/3/ggng510.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Bind plugin to the player with initialization parameters&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;videojs(&amp;quot;myPlayerID&amp;quot;).NielsenBC(&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;apid&amp;quot;: &amp;quot;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_sdkDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* For CMS data binding, the following rules apply&lt;br /&gt;
* The plugin automatically captures the following video data&lt;br /&gt;
* * Data from video duration is automatically capture by the plugin&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;nielsenData.length = videoInfo.duration;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* * Field &amp;quot;type&amp;quot; is set to &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;preroll&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;midroll&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;postroll&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* If video data contains custom fields, all those fields are copied over to Nielsen data: &amp;lt;code&amp;gt;nielsenData[i] = videoInfo.custom_fields[i]&amp;lt;/code&amp;gt; (with 'i' iterated over all custom field names), which may override some of the default values or standard field values&lt;br /&gt;
* '''The plugin does not automatically assign a value to assetid'''. To pass programmatically, use the custom fields object. (See code example below)&lt;br /&gt;
* Parameter videoInfo.id must be a unique string to allow the plugin detecting the content change.&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
The plugin takes metadata at four points.&lt;br /&gt;
&lt;br /&gt;
1.	When the plugin is initialized, it gets &amp;quot;defaults&amp;quot; object from the setup object. These data will be used for ALL videos and for ALL ads in the session (e.g. in the playlist). Certainly, if there are several videos in the list, there is no reason to pass properties this way, because different data can’t be passed for different streams.&lt;br /&gt;
&lt;br /&gt;
2.	When the video starts playing a video, the plugin obtains the following data from the player: name, id, src, length. The plugin calls the player for necessary data and sets the following parameters to the metadata that are being passed to the BSDK with &amp;quot;loadmetadata&amp;quot; events (3/15):&lt;br /&gt;
* assetName = mediaInfo.name&lt;br /&gt;
* title = mediaInfo.name&lt;br /&gt;
* nielsen_mediaid = mediaInfo.id (if defined)&lt;br /&gt;
* mediaURL = the value returned by player.currentSrc() function&lt;br /&gt;
* length = the value returned by player.duration() function. It's 0 for livestreams.&lt;br /&gt;
&lt;br /&gt;
3.	The plugin takes the metadata (custom_fields) from the setup object. These data will be used for ALL videos, but not for ads, in the session&lt;br /&gt;
&lt;br /&gt;
4.	Player takes the metadata (custom_fields) provided for this video. The custom_fields can be filled up either in Video Cloud Studio or while setting up the player programmatically in the script on the HTML page. The plugin takes custom_fields object from the mediaInfo object provided by the player. Please note, the custom_fields object in metadata is not altered by the player in any way.&lt;br /&gt;
&lt;br /&gt;
The plugin puts data taken at these points to the same metadata object that is being passed to the BSDK with &amp;quot;loadmetadata&amp;quot; events (3/15).&lt;br /&gt;
&lt;br /&gt;
So, data taken at point 1 can be overridden by the data with the same name taken at point 2.&lt;br /&gt;
&lt;br /&gt;
Then, the data can be overridden by the data taken at point 3.&lt;br /&gt;
&lt;br /&gt;
Then, the data can be overridden by the data taken at point 4.&lt;br /&gt;
&lt;br /&gt;
Please note that property &amp;quot;default&amp;quot; is used to pass only general data (applied both for ads and content) that are not considered as custom fields of video stream.&lt;br /&gt;
&lt;br /&gt;
The plugin doesn't send events 3/15/49/7/57 to the BSDK if there is no video stream metadata (custom fields) provided. In this case the plugin sends only id3 tags for the content using events 55.&lt;br /&gt;
&lt;br /&gt;
Passing video metadata through the setup object requires initializing the plugin and the BSDK for each video.&lt;br /&gt;
&lt;br /&gt;
We would suggest initializing the plugin and the BSDK once, and setting metadata (custom fields) for videos. It can be done either while initializing playlist/individual-stream or while setting up videos in the Video Cloud Studio.&lt;br /&gt;
&lt;br /&gt;
Example of the setup object: &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
  &amp;quot;apid&amp;quot;: &amp;quot;PXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
  &amp;quot;custom_fields&amp;quot;: {&lt;br /&gt;
     &amp;quot;assetid&amp;quot;: &amp;quot;123456&amp;quot;,&lt;br /&gt;
     &amp;quot;program&amp;quot;: &amp;quot;myProgram&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
  &amp;quot;nol_sdkDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* CMS metadata values can also be set at the asset level&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
  &amp;quot;sources&amp;quot; :&lt;br /&gt;
    [ {&lt;br /&gt;
      &amp;quot;src&amp;quot; : &amp;quot;http://solutions.brightcove.com/../videos/Sea_SeaHorse.mp4&amp;quot;,&lt;br /&gt;
      &amp;quot;type&amp;quot; : &amp;quot;video/mp4&amp;quot;&lt;br /&gt;
    } ],&lt;br /&gt;
    &amp;quot;custom_fields&amp;quot;:&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;assetid&amp;quot;: &amp;quot;6475587654&amp;quot;,&lt;br /&gt;
        &amp;quot;mediaURL&amp;quot;: &amp;quot;http://solutions.brightcove.com/bcls/../videos/Sea_Anemone.mp4&amp;quot;,&lt;br /&gt;
        &amp;quot;dataSrc&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        &amp;quot;hasAds&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;Sea Anemone&amp;quot;,&lt;br /&gt;
      &amp;quot;thumbnail&amp;quot;: &amp;quot;http://solutions.brightcove.com/bcls/assets/images/Sea_Anemone_poster.png&amp;quot;,&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;5195888503001&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Support ===&lt;br /&gt;
The plugin will also extract information about the number and length of advertisements played with the video.&lt;br /&gt;
&lt;br /&gt;
== Opt-Out Implementation ==&lt;br /&gt;
The site must provide a means for the user to opt out of, or opt back into Nielsen Measurement. A user can opt out if preferring to not participate in any Nielsen online measurement research. To implement the Opt-Out option, include the following in the privacy policy page:&lt;br /&gt;
* A notice that the player includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings)&lt;br /&gt;
* A link to the Nielsen Digital Measurement Privacy Policy at http://www.nielsen.com/digitalprivacy&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click choices to read more detailed information about the measurement software and their options. The users can click a link to retrieve an Opt-Out cookie if they do not want to participate in Nielsen online measurement.&lt;br /&gt;
&lt;br /&gt;
Nielsen properties may feature Nielsen proprietary measurement software, which will allow the users to contribute to market research, such as Nielsen TV Ratings.&lt;br /&gt;
&lt;br /&gt;
To learn more about the information that Nielsen software may collect and your choices with regard to it, please see the Nielsen Digital Measurement Privacy Policy at http://www.nielsen.com/digitalprivacy.&lt;br /&gt;
&lt;br /&gt;
=== Opt-In ===&lt;br /&gt;
Once users have opted out, they can choose to opt back into Nielsen Measurement at anytime by selecting the Opt-In link on the Nielsen Digital Privacy Policy page. When a user selects the link, their Opt-Out cookie will be deleted and they will be measured.&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration is certified, there is one update to be made to the existing code to ensure that the player will be measured properly:&lt;br /&gt;
*'''App ID''': Change the apid to the production ID starting with the letter 'P':&amp;lt;syntaxhighlight lang=&amp;quot;console&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''Collection Environment''': Change the value for &amp;lt;code&amp;gt;sfcode&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;dcr-cert&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;dcr&amp;lt;/code&amp;gt; to point traffic to the Nielsen production collection environment. Do not use &amp;lt;code&amp;gt;dcr-cert&amp;lt;/code&amp;gt; for production traffic&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Ensure that the &amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; parameter is not used.&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Czech_SDK_Metadata&amp;diff=3091</id>
		<title>Czech SDK Metadata</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Czech_SDK_Metadata&amp;diff=3091"/>
		<updated>2018-12-13T15:41:18Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for live stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Content ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Popis !! Hodnoty VDO !! Hodnoty LiveStream !! Poznámka / Příklad použití !! Povinné&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unikátní identifikátor pro videoobsah (video soubor). Libovolné označení podle potřeb TV společnosti, které zajistí identifikaci stejného obsahu i napříč platformami. Může být využito i pro řetězení několika informací z interních systémů. Na začátek možnost přidání ID clienta (pro zajištění unikátnosti napříč klienty) || custom but [https://engineeringportal.nielsen.com/docs/Special_Characters no special characters] || custom but [https://engineeringportal.nielsen.com/docs/Special_Characters no special characters] || 1553931_31_08_2016-vicepremier || Ano&lt;br /&gt;
|-&lt;br /&gt;
| type || Pevný číselník určující typ měřeného obsahu. || “content” || “content” ||  || Ano&lt;br /&gt;
|-&lt;br /&gt;
| program || Popis obsahu || Název pořadu || název kanálu př ČT1, Nova, Prima, … ||  || Ano&lt;br /&gt;
|-&lt;br /&gt;
| title || Bližší popis obsahu || Název epizody || Název pořadu (v případě, že je k dispozici a lze jej dynamicky měnit spolu se změnou pořadu. V opačném případě pak vyplnit pouze název kanálu) ||  || Ano&lt;br /&gt;
|-&lt;br /&gt;
| length || Délka vysílaného videoobsahu. Používá se i pro jednoznačné rozlišení VOD a živého vysílání. Jedná se o délku právě přehrávaného obsahu/souboru. Pokud je obsah např. jen částí pořadu, uvádí se délka této přehrávané části pořadu. || Délka pořadu v sekundách || vždy &amp;quot;0&amp;quot;|| || Ano&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Datum vysílání, v případě, že nelze vyplnit korektní hodnotu, prosíme použít konstantu &amp;quot;19700101 00:00:01&amp;quot; || Datum a čas vystavení videoobsahu online. YYYYMMDD HH24:MI:SS || Půlnoc aktuálního dne ve formátu YYYYMMDD 00:00:00 ||  || Ano&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Označení, zda je přehrávaný videoobsah celou epizodou či jen její částí. || “y” – celá epizoda, “n” – část epizody || vždy &amp;quot;y&amp;quot; ||  || Ano&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Identifikátor typu IDEC || Označení originálního „pořadu“ (neboli ID epizody), z jakého byl online umístěný videoobsah vytvořen. Tedy může se stát celkem běžná situace, kdy do TV internetového archivu jsou vloženy např. tři samostatné videosoubory s unikátními AssetID, přičemž všechny tři vznikly z jednoho konkrétního pořadu (např. tři části zábavného pořadu). Všechny tři videosoubory z výše uvedeného příkladu budou mít v položce c0 stejnou hodnotu. Identifikátor (typu IDEC v ČT) – aby mohl být využit pro harmonizaci online a TV dat měl by být tento interní identifikátor i součástí vysílacích protokolů TV stanic. || v objektu metadat nastavte &amp;quot;crossId1&amp;quot; : &amp;quot;&amp;quot; ||  || Ano&lt;br /&gt;
|-&lt;br /&gt;
| c1 || Kód TV stanice pro živé vysílání || prázdné, implementace : &amp;quot;nol_c1&amp;quot;:&amp;quot;p1,&amp;quot; || implementace : &amp;quot;nol_c1&amp;quot;:&amp;quot;p1,value&amp;quot; kde value = Kód živě vysílané stanice používaný ve výstupních datech projektu měření TV sledovanosti. viz. aktuální příloha referenční příručky „ Příloha RP 13 - Seznam stanic.xlsx„ Pokud živé vysílání neodpovídá žádné TV stanici, tak použít kód 9999. ||  || Ano&lt;br /&gt;
|-&lt;br /&gt;
| c2 || TV Ident pro VOD || implementace : &amp;quot;nol_c2&amp;quot; : &amp;quot;p2,value&amp;quot; kde value = Pro co nejlepší zajištění harmonizace dat online měření PEM D s daty TV metrového projektu doporučuje me využívat TV IDENT jako další identifikátor online obsahu. Pokud v době uvedení obsahu online není TVIDENT k dispozici, zůstává c2 nevyplňené (a je možné ho vyplnit později). TVIdent - stejný jako ve vysílacích protokolech TV stanic || prázdné, implementace : &amp;quot;nol_c2&amp;quot;:&amp;quot;p2,&amp;quot; ||  || Ne&lt;br /&gt;
|-&lt;br /&gt;
| segB || Detailnější kategorizace video obsahu. || Programový typ (kódy dle televizního číselníku) || Programový typ přehrávaného obsahu v případě, že je k dispozici a lze jej dynamicky měnit spolu se změnou pořadu. V opačném případě pak posílat prázdné: implementace &amp;quot;segB&amp;quot;:&amp;quot;&amp;quot; ||  || Ano&lt;br /&gt;
|-&lt;br /&gt;
| segC || Detailnější kategorizace video obsahu. || prázdné, v objektu metadat nastavte &amp;quot;segC&amp;quot; : &amp;quot;&amp;quot; || prázdné, v objektu metadat nastavte &amp;quot;segC&amp;quot; : &amp;quot;&amp;quot; ||  || Ano&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Pomocná položka CMS tagu. Způsob nahrávní vkládání reklam: 1. Linear – odpovídá TV vkládání reklam 2. Dynamické – Dynamic Ad Insertion (DAI) || “1” – Lineární “2” – Dynamické || “1” – Lineární “2” – Dynamické || Pro epizody s dynamicky vkládanými pre/mid/postrolly = 2 || Ano&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Pomocná položka CMS tagu. Označení, zda přehrávaný obsah podporuje vkládání reklam. || “0” – Bez reklam “1” – Podporuje reklamy “2” – Nevím (výchozí) || “0” – Bez reklam “1” – Podporuje reklamy “2” – Nevím (výchozí) || 1) AVoD bez reklam - pokud je uživatel zalogován nebo jsou reklamy deaktivovány na CMS úrovni nebo nejsou žádné reklamy = 0 2) AVoD s reklamou (bez ohledu na počet či typ reklam) - pokud uživatel není zalogován, reklamy jsou povoleny na úrovni CMS a reklamy jsou připraveny k vložení =1 3) SVoD bez reklam (aktuální nastavení – uživatel s předplatným sleduje obsah bez reklam) =0 4) SVoD s reklamou (např. uživatel má &amp;quot;dětský balíček&amp;quot; a může sledovat dětské pořady bez reklam, ale ostatní obsah je s reklamou) =1 || Ano&lt;br /&gt;
|-&lt;br /&gt;
| clientid || OPTIONAL - Vyplní se pouze v případech, kdy by uživatel chtěl přepsat sub-brand, který je asociovaný pro dané AppId. || Parent ID || Parent ID ||  || Ne&lt;br /&gt;
|-&lt;br /&gt;
| vcid || OPTIONAL - Vyplní se pouze v případech, kdy by uživatel chtěl přepsat sub-brand, který je asociovaný pro dané AppId.|| sub-brand ID || sub-brand ID ||  || Ne&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
example of metadata object for content&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var contentMetadataObject = {&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;cz-500358-98731568435405&amp;quot;,&lt;br /&gt;
  &amp;quot;program&amp;quot;: &amp;quot;Vítejte na svobodě&amp;quot;,&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;2. díl - 20.6.2018 20:00&amp;quot;,&lt;br /&gt;
  &amp;quot;length&amp;quot;: &amp;quot;3359&amp;quot;,&lt;br /&gt;
  &amp;quot;airdate&amp;quot;: &amp;quot;20180620 20:00:00&amp;quot;,&lt;br /&gt;
  &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&amp;quot;,&lt;br /&gt;
  &amp;quot;crossId1&amp;quot;: &amp;quot;915 954 39504&amp;quot;,&lt;br /&gt;
  &amp;quot;nol_c1&amp;quot;: &amp;quot;p1,&amp;quot;,&lt;br /&gt;
  &amp;quot;nol_c2&amp;quot;: &amp;quot;p2, 651678089925925&amp;quot;,&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
  &amp;quot;mediaURL&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;segB&amp;quot;: &amp;quot;011&amp;quot;,&lt;br /&gt;
  &amp;quot;segC&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
  &amp;quot;hasAds&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ad ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Popis !! Hodnoty !! Povinné&lt;br /&gt;
|-&lt;br /&gt;
| type || Pevný číselník určující typ měřeného obsahu. || “preroll”, “midroll”, “postroll” || Ano&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unikátní identifikátor pro videoobsah (video soubor). Libovolné označení podle potřeb TV společnosti, které zajistí identifikaci stejného obsahu i napříč platformami. Může být využito i pro řetězení několika informací z interních systémů. Na začátek možnost přidání ID clienta (pro zajištění unikátnosti napříč klienty) || libovolný string but [https://engineeringportal.nielsen.com/docs/Special_Characters no special characters] || Ano&lt;br /&gt;
|-&lt;br /&gt;
| c4 || Položka v CMS tagu rezervovaná pro identifikátor umožňující připojení popisu reklamy ze systému RTVK obdobně jako v PEM TV datech.|| &amp;quot;nol_c4&amp;quot; : &amp;quot;p4,value&amp;quot;, kde value je ASMEA kód || Ano&lt;br /&gt;
|-&lt;br /&gt;
| c5 || Detailnější kategorizace video obsahu || &amp;quot;nol_c5&amp;quot; : &amp;quot;p5,value&amp;quot; kde value je Atribut (kódy dle televizního číselníku - pro rozlišení reklamy, upoutávek, komerce) || Ano&lt;br /&gt;
|-&lt;br /&gt;
| c6 || Typ reklamy (stejné hodnoty jako v položce &amp;quot;type&amp;quot;) || &amp;quot;nol_c6&amp;quot; : &amp;quot;p6,value&amp;quot; kde value je “preroll”, “midroll”, “postroll” || Ano&lt;br /&gt;
|-&lt;br /&gt;
| title || Popis reklamy. Možné využití pro případy kdy AKA kód není k dispozici. RTB - oznaceni dodavatele reklamy (např. pokud není k dispozici AKA kod ci blizsi popis reklamy). || Název reklamy, případně řetězení informací (zadavatel_značka_kategorie), nebo oznacení dodavatele reklamy, kde obsah reklamy není znám || Ne&lt;br /&gt;
|-&lt;br /&gt;
| lenght || Délka vysílané reklamy v sekundách. (Aby ukazatel délka byl k dispozici i v případech, kdy AKA kód není k dispozici.) || Délka vysílané reklamy v sekundách. || Ano&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
example of metadata object for ad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var adMetadataObject = {&lt;br /&gt;
  assetid: 'commercial_clip784',&lt;br /&gt;
  type: 'preroll',&lt;br /&gt;
  length: '15',&lt;br /&gt;
  title: 'Ad Tostoriros',&lt;br /&gt;
  nol_c4: 'p4,1488725615',&lt;br /&gt;
  nol_c5: 'p5,3',&lt;br /&gt;
  nol_c6: 'p6,preroll'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Static ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Popis !! Hodnoty !! Povinné&lt;br /&gt;
|-&lt;br /&gt;
| type || Pevný číselník určující typ měřeného obsahu. || “static” || Ano&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unikátní identifikátor pro stránku statického obsahu. Libovolné označení podle potřeb TV společnosti, které zajistí identifikaci stejného obsahu i napříč platformami. Může být využito i pro řetězení několika informací z interních systémů. Na začátek možnost přidání ID clienta (pro zajištění unikátnosti napříč klienty)  || libovolný string but [https://engineeringportal.nielsen.com/docs/Special_Characters no special characters] || Ano&lt;br /&gt;
|-&lt;br /&gt;
| section || Sekce stránky - úroveň 2|| Sekce, ve které se HbbTV statický obsah nachází. || Ano&lt;br /&gt;
|-&lt;br /&gt;
| segA || Kategorizace statického obsahu v rámci HbbTV - úroveň 1 || Např. Název HbbTV aplikace (výběr v HbbTV menu) || Ne&lt;br /&gt;
|-&lt;br /&gt;
| segB || Detailnější kategorizace statického obsahu v rámci HbbTV || Programový typ (kódy dle televizního číselníku), či jiná kategorizace žánru pro statický obsah || Ne&lt;br /&gt;
|-&lt;br /&gt;
| segC || Detailnější kategorizace statického obsahu v rámci HbbTV || k diskuzi, cokoliv || Ne&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
example of metadata object for static&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   var staticMeta = { &lt;br /&gt;
	          &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
                  &amp;quot;assetid&amp;quot;:&amp;quot;hbbtv_home_page&amp;quot;,	     &lt;br /&gt;
                  &amp;quot;section&amp;quot;:&amp;quot;SubPage1&amp;quot;,&lt;br /&gt;
	          &amp;quot;segA&amp;quot;:&amp;quot;HomePage&amp;quot;,&lt;br /&gt;
	          &amp;quot;segB&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
	          &amp;quot;segC&amp;quot;:&amp;quot;&amp;quot;&lt;br /&gt;
	           };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_React_Native_Integration&amp;diff=3090</id>
		<title>DCR React Native Integration</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_React_Native_Integration&amp;diff=3090"/>
		<updated>2018-12-13T15:40:46Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for live stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
This guide will show how to use the Nielsen SDK in React Native applications on Android and iOS devices. We will not go into detail about what React Native is or how to create Apps with this Framework. If you are looking for information on this, please read the [http://facebook.github.io/react-native/ React-Native] documentation.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
For more detail on the native SDKs please refer to the App integration guides available on this portal.&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation covers&lt;br /&gt;
&lt;br /&gt;
* the implementation of React-Native bridges for iOS and Android&lt;br /&gt;
* the usage of the exposed Javascript API&lt;br /&gt;
&lt;br /&gt;
What we will not cover is the general setup of React-Native applications. If you are new to React-Native please refer to [https://facebook.github.io/react-native/ React-Native] for documentation.&lt;br /&gt;
&lt;br /&gt;
For simplicity we have focused on implementing a single instance of the Nielsen SDK. Should there be the need for multiple instances developers have to add some logic for that.&lt;br /&gt;
&lt;br /&gt;
== Setting up your Environment  ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;section-container auto&amp;quot; data-section&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;section&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;title&amp;quot; data-section-title&amp;gt;iOS&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot; data-section-content&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first step is to ensure that the following frameworks and libraries are imported into the Frameworks folder of the iOS Xcode project before working with the Nielsen SDK.&lt;br /&gt;
&lt;br /&gt;
* UIKit.framework&lt;br /&gt;
* Foundation.framework&lt;br /&gt;
* AdSupport.framework&lt;br /&gt;
* SystemConfiguration.framework&lt;br /&gt;
* Security.framework&lt;br /&gt;
** Nielsen Analytics framework makes use of a number of functions in this library.&lt;br /&gt;
* AVFoundation.framework&lt;br /&gt;
** This framework is mandatory for the iOS SDK version 5.1.1 to work.&lt;br /&gt;
* CoreLocation.framework (Not applicable for International (Germany))&lt;br /&gt;
* CoreMedia.framework&lt;br /&gt;
* NielsenAppApi.framework&lt;br /&gt;
&lt;br /&gt;
Nielsens App SDK is compatible with Apple iOS versions 9.0 and above.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt; &lt;br /&gt;
  &amp;lt;div class=&amp;quot;section&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;title&amp;quot; data-section-title&amp;gt;Android&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot; data-section-content&amp;gt;&lt;br /&gt;
The first step is to add the AppSdk.jar library that runs on the Android’s Dalvik Virtual Machine to the libs folder (might have to be created) for the Android part of your project.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android/app/libs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next step is to add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   Download the latest ''google-play-services_lib'' and include it in the App’s project in order to use the App SDK.&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Library'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;Classes/package&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating React-Native bridges for the Nielsen SDK ==&lt;br /&gt;
In order to be able to use Nielsens native SDKs React-Native bridges have to be implemented and added to the iOS and Android projects. The following shows implementations for both platforms, that provide the basic methods to start measuring the app. The source code can be copied from below to provide an easy start.&lt;br /&gt;
&lt;br /&gt;
Please refer to the integration guides for Nielsens native SDKs to get a deeper understanding of the technical detail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;section-container auto&amp;quot; data-section&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;section&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;title&amp;quot; data-section-title&amp;gt;iOS&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot; data-section-content&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The iOS implementation of the bridge module consists of two files, a header and an implementation file, written in Objective-c. These two files need to be added to the iOS XCode project.&lt;br /&gt;
&lt;br /&gt;
The header file is &amp;lt;code&amp;gt;NielsenReactBridge.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
// Copyright &amp;lt;2018&amp;gt; &amp;lt;The Nielsen Company&amp;gt;&lt;br /&gt;
// &lt;br /&gt;
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files&lt;br /&gt;
// (the &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,&lt;br /&gt;
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
// furnished to do so, subject to the following conditions:&lt;br /&gt;
// &lt;br /&gt;
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.&lt;br /&gt;
// &lt;br /&gt;
// THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES&lt;br /&gt;
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR&lt;br /&gt;
// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;React/RCTBridgeModule.h&amp;gt;&lt;br /&gt;
#import &amp;lt;React/RCTEventEmitter.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenReactBridge : RCTEventEmitter &amp;lt;RCTBridgeModule&amp;gt;&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The actual implementation of the module happens in &amp;lt;code&amp;gt;NielsenReactBridge.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
// Copyright &amp;lt;2018&amp;gt; &amp;lt;The Nielsen Company&amp;gt;&lt;br /&gt;
// &lt;br /&gt;
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files&lt;br /&gt;
// (the &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,&lt;br /&gt;
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
// furnished to do so, subject to the following conditions:&lt;br /&gt;
// &lt;br /&gt;
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.&lt;br /&gt;
// &lt;br /&gt;
// THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES&lt;br /&gt;
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR&lt;br /&gt;
// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;NielsenReactBridge.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static NSString *const TAG = @&amp;quot;NielsenReactBridge&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenReactBridge() &amp;lt;NielsenAppApiDelegate&amp;gt;&lt;br /&gt;
@property (strong) NielsenAppApi* nlsSDk;&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenReactBridge&lt;br /&gt;
RCT_EXPORT_MODULE();&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Since we need to communicate the opt-out url to javascript via events&lt;br /&gt;
 * we need to implement the following method&lt;br /&gt;
 */&lt;br /&gt;
- (NSArray&amp;lt;NSString *&amp;gt; *)supportedEvents&lt;br /&gt;
{&lt;br /&gt;
  return @[@&amp;quot;OptOutUrl&amp;quot;];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A logging helper method&lt;br /&gt;
 */&lt;br /&gt;
void NLSLog(NSString* tag, NSString* format, ...)&lt;br /&gt;
{&lt;br /&gt;
  va_list argList;&lt;br /&gt;
  va_start(argList, format);&lt;br /&gt;
  NSLog(@&amp;quot;%@&amp;quot;, [[NSString alloc] initWithFormat:[NSString stringWithFormat:@&amp;quot;[%@]: %@&amp;quot;, tag, format] arguments: argList]);&lt;br /&gt;
  va_end(argList);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Init creates the SDK instance and passes on the provided metadata.&lt;br /&gt;
 * appInfo is simply passed to initWithAppInfo since the SDK already &lt;br /&gt;
 * performs error checking&lt;br /&gt;
 */&lt;br /&gt;
RCT_EXPORT_METHOD(init:(NSDictionary *)appInfo)&lt;br /&gt;
{&lt;br /&gt;
  NLSLog(TAG, @&amp;quot;init called with metadat '%@''&amp;quot;, appInfo);&lt;br /&gt;
&lt;br /&gt;
  if (!self.nlsSDk) {&lt;br /&gt;
    self.nlsSDk= [[NielsenAppApi alloc] initWithAppInfo:appInfo delegate:self];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Wrapper for the SDK's play method. The provided metadata is &lt;br /&gt;
 * simply passed on&lt;br /&gt;
 */&lt;br /&gt;
RCT_EXPORT_METHOD(play:(NSDictionary *)channelInfo)&lt;br /&gt;
{&lt;br /&gt;
  NLSLog(TAG, @&amp;quot;play called with metadata '%@'&amp;quot;, channelInfo);&lt;br /&gt;
&lt;br /&gt;
  if (self.nlsSDk) {&lt;br /&gt;
    [self.nlsSDk play:channelInfo];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Wrapper for the SDK's loadMetadata method. The provided contentMetaData is &lt;br /&gt;
 * simply passed on&lt;br /&gt;
 */&lt;br /&gt;
RCT_EXPORT_METHOD(loadMetadata:(NSDictionary *)contentMetaData)&lt;br /&gt;
{&lt;br /&gt;
  NLSLog(TAG, @&amp;quot;loadMetadata called with '%@'&amp;quot;, contentMetaData);&lt;br /&gt;
&lt;br /&gt;
  if (self.nlsSDk) {&lt;br /&gt;
    [self.nlsSDk loadMetadata:contentMetaData];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Wrapper for the SDK's setPlayheadPosition method. The provided playhead is &lt;br /&gt;
 * simply passed on to the SDK&lt;br /&gt;
 */&lt;br /&gt;
RCT_EXPORT_METHOD(setPlayheadPosition:(nonnull NSNumber *)ph)&lt;br /&gt;
{&lt;br /&gt;
  NLSLog(TAG, @&amp;quot;setHeadPosition called with '%@'&amp;quot;,ph);&lt;br /&gt;
&lt;br /&gt;
  if (self.nlsSDk) {&lt;br /&gt;
    [self.nlsSDk playheadPosition:[ph longLongValue]];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Wrapper for the SDK's stop method. &lt;br /&gt;
 */&lt;br /&gt;
RCT_EXPORT_METHOD(stop)&lt;br /&gt;
{&lt;br /&gt;
  NLSLog(TAG, @&amp;quot;stop called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (self.nlsSDk) {&lt;br /&gt;
    [self.nlsSDk stop];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Wrapper for the SDK's end method. &lt;br /&gt;
 */&lt;br /&gt;
RCT_EXPORT_METHOD(end)&lt;br /&gt;
{&lt;br /&gt;
  NLSLog(TAG, @&amp;quot;end called&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (self.nlsSDk) {&lt;br /&gt;
    [self.nlsSDk end];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * optOutUrl retrieves the url from the SDK instance and fires off the&lt;br /&gt;
 * OptOutUrl event, so the url can be captured&lt;br /&gt;
 */&lt;br /&gt;
RCT_EXPORT_METHOD(optOutUrl)&lt;br /&gt;
{&lt;br /&gt;
  [self sendEventWithName:@&amp;quot;OptOutUrl&amp;quot; body:@{@&amp;quot;url&amp;quot;: self.nlsSDk.optOutURL}];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt; &lt;br /&gt;
  &amp;lt;div class=&amp;quot;section&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;title&amp;quot; data-section-title&amp;gt;Android&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot; data-section-content&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Android implementation of the bridge module consists of two files, an implementation of a NielsenPackage to announce the actual module and the implementation of NielsenReactBridge itself. The implementations have been put into the Java package&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.nielsen.app.react&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The package implementation is in &amp;lt;code&amp;gt;com/nielsen/app/react/NielsenPackage.java&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Copyright &amp;lt;2018&amp;gt; &amp;lt;The Nielsen Company&amp;gt;&lt;br /&gt;
// &lt;br /&gt;
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files&lt;br /&gt;
// (the &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,&lt;br /&gt;
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
// furnished to do so, subject to the following conditions:&lt;br /&gt;
// &lt;br /&gt;
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.&lt;br /&gt;
// &lt;br /&gt;
// THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES&lt;br /&gt;
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR&lt;br /&gt;
// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
&lt;br /&gt;
package com.nielsen.app.react;&lt;br /&gt;
&lt;br /&gt;
import com.facebook.react.bridge.NativeModule;&lt;br /&gt;
import com.facebook.react.bridge.ReactApplicationContext;&lt;br /&gt;
import com.facebook.react.ReactPackage;&lt;br /&gt;
import com.facebook.react.uimanager.ViewManager;&lt;br /&gt;
import com.nielsen.app.react.NielsenReactBridge;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collections;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 */&lt;br /&gt;
public class NielsenPackage implements ReactPackage {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Override createNativeModules to return our bridge module&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;NativeModule&amp;gt; createNativeModules(ReactApplicationContext reactContext) {&lt;br /&gt;
        List&amp;lt;NativeModule&amp;gt; modules = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
        modules.add(new NielsenReactBridge(reactContext));&lt;br /&gt;
&lt;br /&gt;
        return modules;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
    */&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;ViewManager&amp;gt; createViewManagers(ReactApplicationContext reactContext) {&lt;br /&gt;
        return Collections.emptyList();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com/nielsen/app/react/NielsenReactBridge.java&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Copyright &amp;lt;2018&amp;gt; &amp;lt;The Nielsen Company&amp;gt;&lt;br /&gt;
// &lt;br /&gt;
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files&lt;br /&gt;
// (the &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,&lt;br /&gt;
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
// furnished to do so, subject to the following conditions:&lt;br /&gt;
// &lt;br /&gt;
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.&lt;br /&gt;
// &lt;br /&gt;
// THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES&lt;br /&gt;
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR&lt;br /&gt;
// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
&lt;br /&gt;
package com.nielsen.app.react;&lt;br /&gt;
&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import com.facebook.react.bridge.LifecycleEventListener;&lt;br /&gt;
import com.facebook.react.bridge.ReactApplicationContext;&lt;br /&gt;
import com.facebook.react.bridge.ReactContextBaseJavaModule;&lt;br /&gt;
import com.facebook.react.modules.core.DeviceEventManagerModule;&lt;br /&gt;
import com.facebook.react.bridge.ReactMethod;&lt;br /&gt;
import com.facebook.react.bridge.ReadableMap;&lt;br /&gt;
import com.facebook.react.bridge.WritableMap;&lt;br /&gt;
import com.facebook.react.bridge.Arguments;&lt;br /&gt;
import com.facebook.react.bridge.ReadableMapKeySetIterator;&lt;br /&gt;
import com.nielsen.app.sdk.AppSdk;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.AppLaunchMeasurementManager;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * NielsenReactBridge is the class briding between react JS code&lt;br /&gt;
 * and the native Nielsen SDK.&lt;br /&gt;
 */&lt;br /&gt;
public class NielsenReactBridge extends ReactContextBaseJavaModule &lt;br /&gt;
                                implements IAppNotifier, LifecycleEventListener {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
    */&lt;br /&gt;
    private static final String NIELSEN_TAG = &amp;quot;NielsenReactBridge&amp;quot;;&lt;br /&gt;
    private AppSdk mAppSdk = null; // the AppSdk main object&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor for the NielsenReactBridge&lt;br /&gt;
     * Adds the new instance as LifeCycleEventListener for conttex&lt;br /&gt;
     * @param context  The react application context&lt;br /&gt;
     */&lt;br /&gt;
    public NielsenReactBridge(ReactApplicationContext context) {&lt;br /&gt;
        super(context);&lt;br /&gt;
        context.addLifecycleEventListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Implements getName method from ReactContextBaseJavaModule&lt;br /&gt;
     * @return  The constant string 'NielsenReactBridge'&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    public String getName() {&lt;br /&gt;
        return &amp;quot;NielsenReactBridge&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Implements getName method from IAppNotifier&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long l, int i, String s) {}&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Initializes the module for use &lt;br /&gt;
     * @param obj   An instance of ReadableMap (mapped JS object) containing&lt;br /&gt;
     *              initialization meta data&lt;br /&gt;
     */&lt;br /&gt;
    @ReactMethod&lt;br /&gt;
    public void init(final ReadableMap obj) {&lt;br /&gt;
&lt;br /&gt;
        Log.d(NIELSEN_TAG, &amp;quot;Called init&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if (null == mAppSdk) {&lt;br /&gt;
            try {&lt;br /&gt;
                JSONObject appSdkConfig = readableMapToJSONObject(obj);&lt;br /&gt;
                mAppSdk = new AppSdk(getReactApplicationContext(), appSdkConfig, this);&lt;br /&gt;
                if (!mAppSdk.isValid())&lt;br /&gt;
                {&lt;br /&gt;
                    Log.e(NIELSEN_TAG, &amp;quot;SDK Init failed&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            catch(Exception ex) {&lt;br /&gt;
            }   &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Static method to convert ReadableMap instances to JSONObject instances&lt;br /&gt;
     * (used by the Nielsen SDK)&lt;br /&gt;
     * @param obj   The ReadableMap instance to be converted&lt;br /&gt;
     * @return      An instance of JSONObject containing the mapped JS object&lt;br /&gt;
     *              values (if successful, empty otherwise) &lt;br /&gt;
     */&lt;br /&gt;
    static private JSONObject readableMapToJSONObject(final ReadableMap obj) {&lt;br /&gt;
&lt;br /&gt;
        JSONObject ret = new JSONObject();&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            ReadableMapKeySetIterator it = obj.keySetIterator();&lt;br /&gt;
            while (it.hasNextKey()) {&lt;br /&gt;
                String key = it.nextKey();&lt;br /&gt;
                ret.put(key, obj.getDynamic(key).asString());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        catch (JSONException ex) {&lt;br /&gt;
            Log.e(NIELSEN_TAG, ex.getMessage());&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Wrapper for the Nielsen SDK play method. Simply forwards calls &lt;br /&gt;
     * to the SDK.&lt;br /&gt;
     * @param obj   ReadableMap instance containing the mapped JS meta&lt;br /&gt;
     *              data object, e.g. {channelName: 'channel name here'}&lt;br /&gt;
     */&lt;br /&gt;
    @ReactMethod&lt;br /&gt;
    public void play(final ReadableMap obj) {&lt;br /&gt;
&lt;br /&gt;
        Log.d(NIELSEN_TAG, &amp;quot;Called play &amp;quot; + obj.toString());&lt;br /&gt;
        if (null != mAppSdk) {&lt;br /&gt;
            JSONObject playObject = readableMapToJSONObject(obj);&lt;br /&gt;
            mAppSdk.play(playObject);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Wrapper for the Nielsen SDK loadMetadata method. Simply forwards calls &lt;br /&gt;
     * to the SDK.&lt;br /&gt;
     * @param obj   ReadableMap instance containing the mapped JS meta&lt;br /&gt;
     *              data object&lt;br /&gt;
     */&lt;br /&gt;
    @ReactMethod&lt;br /&gt;
    public void loadMetadata(final ReadableMap obj) {&lt;br /&gt;
&lt;br /&gt;
        Log.d(NIELSEN_TAG,&amp;quot;Called loadMetadata&amp;quot;);&lt;br /&gt;
        if (null != mAppSdk) {&lt;br /&gt;
            JSONObject contentMetadata = readableMapToJSONObject(obj);&lt;br /&gt;
            mAppSdk.loadMetadata(contentMetadata);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Wrapper for the Nielsen SDK setPlayheadPosition method. Simply &lt;br /&gt;
     * forwards calls to the SDK.&lt;br /&gt;
     * @param ph    The current playhead position&lt;br /&gt;
     */&lt;br /&gt;
    @ReactMethod&lt;br /&gt;
    public void setPlayheadPosition(final Double ph) {&lt;br /&gt;
&lt;br /&gt;
        Log.d(NIELSEN_TAG,&amp;quot;Called setPlayHeadPosition: &amp;quot; + &amp;quot; &amp;quot; + ph);&lt;br /&gt;
        if (null != mAppSdk) {&lt;br /&gt;
            mAppSdk.setPlayheadPosition(ph.longValue());&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Wrapper for the Nielsen SDK stop method. Simply &lt;br /&gt;
     * forwards calls to the SDK.&lt;br /&gt;
     */&lt;br /&gt;
    @ReactMethod&lt;br /&gt;
    public void stop() {&lt;br /&gt;
        Log.d(NIELSEN_TAG, &amp;quot;Called stop&amp;quot;);&lt;br /&gt;
        if (null != mAppSdk) {&lt;br /&gt;
            mAppSdk.stop();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Wrapper for the Nielsen SDK end method. Simply &lt;br /&gt;
     * forwards calls to the SDK.&lt;br /&gt;
     */&lt;br /&gt;
    @ReactMethod&lt;br /&gt;
    public void end() {&lt;br /&gt;
        &lt;br /&gt;
        Log.d(NIELSEN_TAG,&amp;quot;Called end&amp;quot;);&lt;br /&gt;
        if (null != mAppSdk) {&lt;br /&gt;
            mAppSdk.end();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Wrapper to retrieve the optOutUrl from the Nielsen SDK. &lt;br /&gt;
     * Emits a &amp;quot;OptOutUrl&amp;quot; event with the url as payload.&lt;br /&gt;
     * Needs to be catched in JS&lt;br /&gt;
     */&lt;br /&gt;
    @ReactMethod&lt;br /&gt;
    public void optOutUrl() {&lt;br /&gt;
&lt;br /&gt;
        WritableMap params = Arguments.createMap();&lt;br /&gt;
        if (null != mAppSdk) {&lt;br /&gt;
            params.putString(&amp;quot;url&amp;quot;, mAppSdk.userOptOutURLString());&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        getReactApplicationContext()&lt;br /&gt;
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)&lt;br /&gt;
        .emit(&amp;quot;OptOutUrl&amp;quot;, params);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Implements LifecycleEventListener's onHostResume method.&lt;br /&gt;
     * Uses AppLaunchMeasurementManager.appInForeground to notify SDK about&lt;br /&gt;
     * app coming to foreground again&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onHostResume() {&lt;br /&gt;
&lt;br /&gt;
        Log.d(NIELSEN_TAG,&amp;quot;Called onHostResume&amp;quot;);&lt;br /&gt;
        AppLaunchMeasurementManager.appInForeground(getReactApplicationContext());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Implements LifecycleEventListener's onHostPause method.&lt;br /&gt;
     * Uses AppLaunchMeasurementManager.appInBackground to notify SDK about&lt;br /&gt;
     * app going to background&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onHostPause() {&lt;br /&gt;
&lt;br /&gt;
        Log.d(NIELSEN_TAG,&amp;quot;Called onHostPause&amp;quot;);&lt;br /&gt;
        AppLaunchMeasurementManager.appInBackground(getReactApplicationContext());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Implements LifecycleEventListener's onHostDestroy method.&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onHostDestroy() {&lt;br /&gt;
        Log.d(NIELSEN_TAG,&amp;quot;Called onHostDestroy&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The package needs to be provided in the getPackages method of the MainApplication.java file. This file exists under the android folder in your react-native application directory. The path to this file is: android/app/src/main/java/com/your-app-name/MainApplication.java.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import com.nielsen.app.react.NielsenPackage;   //&amp;lt;-- Import the package in MainApplication.java&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
    protected List&amp;lt;ReactPackage&amp;gt; getPackages() {&lt;br /&gt;
        return Arrays.&amp;lt;ReactPackage&amp;gt;asList(&lt;br /&gt;
                //...,&lt;br /&gt;
                new NielsenPackage()); // &amp;lt;-- Add the bridge package to the getPackages method.&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to import the bridges into the Javascript context, create a file&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenModule.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import { NativeModules } from 'react-native'&lt;br /&gt;
&lt;br /&gt;
export default NativeModules.NielsenReactBridge&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The bridge implementations above allow the usage of one instance of the Nielsen App SDK. The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. For more information on this please read the relevant App SDK Guide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that can be passed via the AppInfo JSON schema.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). The appid is a GUID data type and is specific to the application.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen. It is GUID data type.|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| Nielsen Sample App&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''Italian Clients'''&lt;br /&gt;
* &amp;quot;it&amp;quot;&lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;it&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_devDebug || Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|| Nielsen-specified || While not live || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    import NielsenModule from './NielsenModule';&lt;br /&gt;
&lt;br /&gt;
    let appInformation = {&amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-XXXX-XXXX-2A788BCXXXCA&amp;quot;,&lt;br /&gt;
                          &amp;quot;sfcode&amp;quot;: &amp;quot;it&amp;quot;,&lt;br /&gt;
                          &amp;quot;nol_devDebug&amp;quot;: @&amp;quot;DEBUG&amp;quot;};&lt;br /&gt;
   NielsenModule.init(appInformation);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Configure Payload ==&lt;br /&gt;
All metadata is passed to the bridges in form of objects containing the in the following described properties. An example metadata object could look like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let metadata = {&lt;br /&gt;
    'type':'content',&lt;br /&gt;
    'assetid':'asset12345',&lt;br /&gt;
    'program':'My Program',&lt;br /&gt;
    'title':'My Title',&lt;br /&gt;
    'length':'42',&lt;br /&gt;
    'airdate':'20180302 16:32:00',&lt;br /&gt;
    'isfullepisode':'n',&lt;br /&gt;
    'adloadtype':'2'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
The following section will explain the different values.&lt;br /&gt;
&lt;br /&gt;
=== Configure metadata === &lt;br /&gt;
Configure metadata should remain constant throughout the completion of an episode or live stream.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !!	Values	 !! Required&lt;br /&gt;
|-&lt;br /&gt;
| channelName	|| Any string representing the channel/stream	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content metadata ===&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required&lt;br /&gt;
|-&lt;br /&gt;
| type || type of asset || &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| program ||name of program (25 character limit) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| title ||name of program (40 character limit) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| length || length of content in seconds || &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| airdate || the airdate in the linear TV; if not known set it to eg. &amp;quot;19700101 00:00:00&amp;quot; || YYYYMMDD HH24:MI:SS || Yes&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || full episode flag || &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode || Yes&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || type of ad load:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt; Linear – matches TV ad load&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
|| &amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; - DCR measures content with dynamic ads || Yes&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Measurement ===&lt;br /&gt;
The Nielsen SDK is able to monitor Application launch events and how long your app has been running. Once the Nielsen module has been Initialized, pass a metadata object to loadMeta data that follows these rules: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Data Type !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| type || asset type || fixed || &amp;lt;code&amp;gt;'static'&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| section || section of each site (e.g. section value should be first level in page URL: website.com/section). Limit to 25 unique values || dynamic || custom || Yes&lt;br /&gt;
|}&lt;br /&gt;
You only need to do this once upon app start.&lt;br /&gt;
&lt;br /&gt;
== Configure API Calls ==&lt;br /&gt;
=== Sample API Sequence ===&lt;br /&gt;
A Sample API sequence could follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
|On App Start||&amp;lt;code&amp;gt;NielsenModule.loadMetadata(contentMetadata);&amp;lt;/code&amp;gt; || // contentMetadata Object contains the JSON metadata for the impression&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;NielsenModule.play(channelName);&amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel/video name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NielsenModule.loadMetadata(contentMetadataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| Content || &amp;lt;code&amp;gt;NielsenModule.playheadPosition(position);&amp;lt;/code&amp;gt; || // playheadPosition is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;NielsenModule.end();&amp;lt;/code&amp;gt; || // Content playback is completed.&lt;br /&gt;
|}&lt;br /&gt;
=== Life cycle of SDK instance ===&lt;br /&gt;
Life cycle of SDK instance includes four general states:&lt;br /&gt;
# '''Initial state''' – The SDK is not initialized and hence, not ready to process playing information. Once the SDK is moved out of this state, it needs instantiation of the new SDK instance in order to get the instance in the '''Initial state'''.&lt;br /&gt;
# '''Idle state''' – The SDK is initialized and is ready to process playing information. Once Initialized, the SDK instance is not processing any data, but is listening for the play event to occur.&lt;br /&gt;
# '''Processing state''' – The SDK instance is processing playing information. [[DCR_Video_APP_SDK#play|play]] and [[DCR_Video_APP_SDK#loadMetadata|loadMetadata]] calls move the SDK instance into this state. In this state, the SDK instance will be able to process the following calls.&lt;br /&gt;
## [[DCR_Video_APP_SDK#playheadPosition|playheadPosition]] – Call this API every one second when playhead position timer is fired.&lt;br /&gt;
## [[DCR_Video_APP_SDK#stop|stop]] – Call this API when the playback is paused, switches between content and ad (within the same content playback) or encounters interruptions.&lt;br /&gt;
## [[DCR_Video_APP_SDK#end|end]] – SDK instance exits from Processing state when this API is called.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' For API Version 5.1 and above, App SDK will fire data pings and continue measurement even after the user has opted out from Nielsen measurement on a device. The data ping will be marked as opted-out ping.&lt;br /&gt;
&lt;br /&gt;
'''Note''': In case of any interruptions during playback due to alarm, calendar, call, flight mode, Wi-Fi toggle, channel change, etc., call [[stop]] to stop the measurement.&lt;br /&gt;
* As soon as the playback resumes, call [[DCR_Video_APP_SDK#loadMetadata|loadMetadata]] and  [[DCR_Video_APP_SDK#playheadPosition|playheadPosition]].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sequence of Calls ===&lt;br /&gt;
=== play ===&lt;br /&gt;
Use the play function to pass the channel descriptor information through channelName parameter when the user taps the '''Play''' button on the player.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;   NielsenModule.play(channelInfo);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== loadMetadata ===&lt;br /&gt;
The loadMetadata function is used to inform the SDK about new content. The contentMetadata object passed in should contain the values as described above.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;   NielsenModule.loadMetadata(contentMetadata);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== playheadPosition ===&lt;br /&gt;
Use playheadPosition to tell the SDK about the current position in the video. For live content this should be the Unix timestamp (seconds since Jan-1-1970 UTC). For on-demand content, simply the playhead position in seconds.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;   NielsenModule.playheadPosition(playheadPos);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== stop ===&lt;br /&gt;
Tell the SDK that content playback has stopped.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;   NielsenModule.stop();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== end ===&lt;br /&gt;
When content stop is initiated and content cannot be resumed from the same position (it can only be restarted from the beginning of stream).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;   NielsenModule.end();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
To opt out, users must have access to &amp;quot;[https://priv-policy.imrworldwide.com/priv/mobile/it/it/optout.html About Nielsen Measurement]&amp;quot; page. User can click this page from app settings screen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
*URL for the Nielsen Privacy web page should be retrieved from via the &amp;lt;code&amp;gt;optOutURL()&amp;lt;/code&amp;gt; method of the SDK bridge and opened in 'WebView' / External browser.&lt;br /&gt;
*If the returned value is null or empty, handle the exception gracefully and retry later.&lt;br /&gt;
&lt;br /&gt;
Due to the limitation that native methods can't return values directly, the URL will be sent to the Javascript context as &amp;quot;OptOutUrl&amp;quot; event, with the url as the payload.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    const nielsen = new NativeEventEmitter(NielsenModule);&lt;br /&gt;
    &lt;br /&gt;
    const subscription = nielsen.addListener(&lt;br /&gt;
      'OptOutUrl',&lt;br /&gt;
      (data) =&amp;gt; { &lt;br /&gt;
         //display data.url&lt;br /&gt;
      }&lt;br /&gt;
    );&lt;br /&gt;
    NielsenModule.optOutUrl();&lt;br /&gt;
   //...&lt;br /&gt;
   subscription.remove(); // do not forget to unsubscribe&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The app must provide access to &amp;quot;About Nielsen Measurement&amp;quot; page for the users. Include &amp;quot;About Nielsen Measurement&amp;quot; and Your Choices link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
[[File:Privacy policy iOS.jpg|link=]]&lt;br /&gt;
&lt;br /&gt;
*App should provide a UI control like 'close' or 'back' button to close the 'WebView' / External browser.&lt;br /&gt;
&lt;br /&gt;
Users can opt out or opt back into Nielsen Measurement. Opt-Out feature relies on iOS' system setting – &amp;quot;Limit Ad Tracking&amp;quot;. The setting can be accessed in the Settings application on any iOS device: '''Settings → Privacy → Advertising → Limit Ad Tracking'''.&lt;br /&gt;
&lt;br /&gt;
User is opted out of Nielsen online measurement research when the &amp;quot;Limit Ad Tracking&amp;quot; setting is enabled.&lt;br /&gt;
&lt;br /&gt;
[[File:Opt-Out iOS.jpg|link=]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' For API Version 5.1 and above, App SDK will fire data pings and continue measurement even after the user has opted out from Nielsen measurement on a device. The data ping will be marked as opted-out ping.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
Following Nielsen testing, users need to make one update to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
&lt;br /&gt;
# '''Debug Logging''': Disable logging by deleting &amp;lt;code&amp;gt;{nol_devDebug: 'DEBUG'}&amp;lt;/code&amp;gt; from initialization call.&lt;br /&gt;
#* '''Example Production Initialization Call''' - Refer to the production initialization call below:&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;Example:&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    let appInformation = {&lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;it&amp;quot;&lt;br /&gt;
            // Remove Flag:   &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
    NielsenModule.init(appInformation);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_India_Video_Browser_SDK&amp;diff=3089</id>
		<title>DCR India Video Browser SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_India_Video_Browser_SDK&amp;diff=3089"/>
		<updated>2018-12-13T15:40:02Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for live stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring live (beam) and on-demand (stream) content viewing using TVs, mobile devices, etc.&lt;br /&gt;
The Browser SDK is the framework for browsers developers to integrate Nielsen Measurement into their media player pages.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an AppID is needed. The AppID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration from Nielsen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  apid: &amp;quot;XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot; // eg. PDA7D5EE6-B1B8-XXXX-XXXX-2A788BCXXXCA&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
=== Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing (not in production) || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.eu.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique AppID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  // Add Static Queue Snippet&lt;br /&gt;
 !function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
 var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;P14273221-CF5C-46BF-A832-994AEFB73AA4&amp;quot;,&amp;quot;myPlayerName&amp;quot;, {nol_sdkDebug: &amp;quot;DEBUG&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create Metadata Objects ===&lt;br /&gt;
There are two types of asset metadata:&lt;br /&gt;
*content: identify video&lt;br /&gt;
*ad: identify each ad&lt;br /&gt;
&lt;br /&gt;
The metadata received for each asset is used for classification and reporting.&lt;br /&gt;
&lt;br /&gt;
Metadata can be passed through key-values using the Nielsen reserved keys. User will need to set up content and ad objects with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
&lt;br /&gt;
==== Content Metadata ====&lt;br /&gt;
Content metadata should remain constant throughout the completion of an episode / clip including the ads play.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (25 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (40 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;	full episode flag&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;	'y'- full episode, 'n'- non full episode&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ad model (only pass value as 2)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '2'&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom Parameters for Analytical Reporting Only ===&lt;br /&gt;
The below values will not be part of standard reporting and designed for custom analytical reporting only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Parameter names !! Description !! Values !! Example !!Required/Obligatory&lt;br /&gt;
|-&lt;br /&gt;
| nol_c0 ||bc_lang 	|| Language of the content        || [[BARC_Custom_Codes|Language Code]] (64 codes)        ||  &amp;lt;code&amp;gt;'0001'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c1  || bc_adsupport || Ad Supported Flag     || &amp;lt;code&amp;gt;'Y' or 'N'&amp;lt;/code&amp;gt;         ||  &amp;lt;code&amp;gt;'Y'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
|  nol_c2 || bc_ugc	|| User Generated Content    || &amp;lt;code&amp;gt;'Y' or 'N'&amp;lt;/code&amp;gt;           ||  &amp;lt;code&amp;gt;'Y'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c4 || bc_sub || Subscribed or Free     ||  &amp;lt;code&amp;gt;'S' or 'F'&amp;lt;/code&amp;gt;          ||  &amp;lt;code&amp;gt;'S'&amp;lt;/code&amp;gt;     ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c5  ||bc_download||Downloaded or Streamed content       || &amp;lt;code&amp;gt;'D' or 'S'&amp;lt;/code&amp;gt;         ||   &amp;lt;code&amp;gt;'D' &amp;lt;/code&amp;gt;    ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c7  ||bc_ccat ||Content code      || [[BARC_Custom_Codes|ContentTypeID]] (10 codes)       ||  &amp;lt;code&amp;gt;'6'&amp;lt;/code&amp;gt;   ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c8  || bc_cgenre || Genre       || [[BARC_Custom_Codes|BARC Custom Codes]] (81 codes)        ||  'F12'    ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c9 ||bc_do || Distributor or Owner    || &amp;lt;code&amp;gt;'D' or 'O'&amp;lt;/code&amp;gt;         ||  &amp;lt;code&amp;gt;'Y'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| nol_10 || bc_dname  || Distributor name      || BARC Predefined numeric/alphanumeric value      ||  'A123'  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
|nol_c11   ||bc_altype || Ad load type    || &amp;lt;code&amp;gt;'1' or '2' or '3'&amp;lt;/code&amp;gt;         ||  &amp;lt;code&amp;gt;'1'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note:''' nol_c3 and nol_c6 must not be set!&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example Content Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var content_metadata_object = {  &lt;br /&gt;
  // SDK&lt;br /&gt;
  type:      'content',&lt;br /&gt;
  assetid:   'VID123-123456',&lt;br /&gt;
  program:   'program name',&lt;br /&gt;
  title:     'episode title',&lt;br /&gt;
  length:    '543',&lt;br /&gt;
  isfullepisode: 'n',&lt;br /&gt;
  adloadtype:'2',&lt;br /&gt;
  &lt;br /&gt;
 //Custom Properties for Analysis&lt;br /&gt;
// Examples only&lt;br /&gt;
  nol_c0:  'bc_lang,0001',&lt;br /&gt;
  nol_c1:  'bc_adsupport,Y'&lt;br /&gt;
  nol_c2:  'bc_ugc,Y',&lt;br /&gt;
  nol_c4:  'bc_sub,S',&lt;br /&gt;
  nol_c5:  'bc_download,S',&lt;br /&gt;
  nol_c7:  'bc_ccat,6',&lt;br /&gt;
  nol_c8:  'bc_cgenre,N1',&lt;br /&gt;
  nol_c9:  'bc_do,D',&lt;br /&gt;
  nol_c10:  'bc_dname,A123',&lt;br /&gt;
  nol_c11:  'bc_altype,1'&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Object ===&lt;br /&gt;
The ad metadata should be passed for each individual ad.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Ad Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var adMetadataObject = &lt;br /&gt;
{  &lt;br /&gt;
  assetid: 'AD-1',&lt;br /&gt;
  type:    'preroll'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt; URL Character Limit: There is a URL character limit of 2K characters due to browser limitations. Exceeding this value could impair data delivery on particular browsers. &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avoid Carriage Return (CR) and/or Linefeeds (LF) in all fields (because of current data reporting as CSV)!&lt;br /&gt;
Implementations has to filter out CR/LF with appropriate programming.&lt;br /&gt;
It's also a good idea to check and validate entries from other systems (eg. CMS, player) before simply copy them to the variables in metadata.&lt;br /&gt;
&lt;br /&gt;
==== Call Nielsen APIs ====&lt;br /&gt;
The method for calling events is ggPM().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM('event', parameter, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt Scenarios ==&lt;br /&gt;
&lt;br /&gt;
=== Pause Event ===&lt;br /&gt;
To indicate pause&lt;br /&gt;
&lt;br /&gt;
* Call [[stop]] immediately and withhold sending playhead position.&lt;br /&gt;
* Start sending pings – [[loadMetadata]] and [[playheadPosition]] - once the playback resumes.&lt;br /&gt;
&lt;br /&gt;
=== Other Interrupt Scenarios ===&lt;br /&gt;
The following possible browser interruption scenarios must be handled:&lt;br /&gt;
&lt;br /&gt;
* Browser/Tab close&lt;br /&gt;
* Leaving the page to another destination&lt;br /&gt;
* Pressing the stop button&lt;br /&gt;
&lt;br /&gt;
There are many cases where the player itself has the ability to detect such situations. If not, these interruption scenarios can be handled through JavaScript. The events that are called will depend on the asset being played (e.g. midroll vs. content).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var stopped = false;&lt;br /&gt;
function closePlayer() {&lt;br /&gt;
	if (stopped) {return;}&lt;br /&gt;
	stopped = true;&lt;br /&gt;
	if (inMidroll) {    // Only inside a midroll indicate &amp;lt;stop&amp;gt; for the ad&lt;br /&gt;
		nSdkInstance.ggPM('stop', playheadPositionMidroll);&lt;br /&gt;
	}&lt;br /&gt;
	nSdkInstance.ggPM('end', playheadPositionContent);    // Indicate &amp;lt;end&amp;gt; for the content&lt;br /&gt;
};&lt;br /&gt;
window.addEventListener(&amp;quot;beforeunload&amp;quot;, function (e) {&lt;br /&gt;
	closePlayer();   // call nielsensdk with end/stop&lt;br /&gt;
});&lt;br /&gt;
window.addEventListener(&amp;quot;pagehide&amp;quot;, function (e) {	// for iOS mobile &amp;quot;pagehide&amp;quot; recommended by apple&lt;br /&gt;
	closePlayer();   // call nielsensdk with end/stop&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' User may need to add code to support specific browser versions (e.g. older versions of Internet Explorer or covering Safari on mobile browsers ... you may use &amp;quot;onpagehide&amp;quot; event as well).&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Call Nielsen APIs ==&lt;br /&gt;
The method for calling events is ggPM().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM('event', parameter);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Events ===&lt;br /&gt;
The events are included in the table below:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event name !! Values to pass !!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each content/ad metadata object&lt;br /&gt;
|-&lt;br /&gt;
| 'setPlayheadPosition'&lt;br /&gt;
||&lt;br /&gt;
*&amp;quot;&amp;quot;VOD (or ad )/Stream: || current position in seconds (integer)&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt; nSdkInstance.ggPM('setPlayheadPosition', Math.round(player.getcurrentPosition)) &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*&amp;quot;&amp;quot;Live/Beam: current Unix timestamp (seconds since Jan-1-1970 UTC) &amp;lt;br/&amp;gt;&lt;br /&gt;
var currenttime = Math.round(newDate()/1000);&amp;lt;br/&amp;gt; &amp;lt;br/&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;setPlayheadPosition&amp;quot;,&lt;br /&gt;
currenttime);&amp;lt;br/&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' ||	playhead position in seconds	|| Call when ads complete playing and at the very end of the stream. The playhead position must be passed when calling stop&lt;br /&gt;
|-&lt;br /&gt;
| 'end'	|| playhead position in seconds	|| This event has to be called once for the current video asset at the end of the playback.At the end of the content stream, if the user switches to another piece of content or when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Playhead position as integer&lt;br /&gt;
&lt;br /&gt;
'''Note:''' 'setPlayheadPosition' has to be called every second (for livestream send the Unix timestamp (seconds since Jan-1-1970 UTC), for VOD send the time in seconds as integer) &lt;br /&gt;
&lt;br /&gt;
==== Example Events ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Event:''' loadMetadata  |  '''Value Pass ( Object ):''' Content Metadata Object&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  nSdkInstance.ggPM('loadMetadata', contentMetadataObject); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Event:''' loadMetadata  |  '''Value Pass  ( Object ):''' Pre-roll AD Metadata Object&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  nSdkInstance.ggPM('loadMetadata', prerollMetadataObject); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Event:''' setPlayheadPosition  |  '''Value Pass ( Integer ):''' playheadPosition&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  nSdkInstance.ggPM('setPlayheadPosition', playheadPosition); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Event:''' stop  |  '''Value Pass ( Integer ):''' stopPlayheadPosition &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  nSdkInstance.ggPM('stop', stopPlayheadPosition); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Event:''' end  |  '''Value Pass ( Integer ):''' endPlayheadPosition &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  nSdkInstance.ggPM('end', endPlayheadPosition); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  SDK Event Lifecycle ==&lt;br /&gt;
&lt;br /&gt;
The sample event lifecycle can be used as a reference for identifying the order for calling events.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Examples|&lt;br /&gt;
without Ads|&lt;br /&gt;
&lt;br /&gt;
==== Event Lifecycle without ads: ====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:even browser no ads.png]]&lt;br /&gt;
&lt;br /&gt;
==== Example without ads: ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// START OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);  // must be called as start of stream&lt;br /&gt;
&lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);  // must be fired every second with playhead starting from 0 (or with seconds since 1970-01-01 00:00:00 in case of livestream)&lt;br /&gt;
&lt;br /&gt;
... /*** pass playheads every second ***/&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', lastPlayheadPosition);&lt;br /&gt;
// END OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('end', endPlayheadPosition);  // has to be called here at the end of the content&lt;br /&gt;
// endPlayheadPosition = lastPlayheadPosition&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|with Ads=&lt;br /&gt;
&lt;br /&gt;
==== Event Lifecycle with ads: ====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:event browser.png|event browser.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example with ads: ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// START OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject); // must be called as start of stream (even if 1st asset is preroll)&lt;br /&gt;
 &lt;br /&gt;
// PREROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', prerollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition); // must be fired every second with playhead starting from 0&lt;br /&gt;
&lt;br /&gt;
... /*** pass playhead every second ***/&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', lastPlayheadPosition);  // end pre-roll stream&lt;br /&gt;
nSdkInstance.ggPM('stop', stopPlayheadPosition);  // stopPlayheadPosition = lastPlayheadPosition&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);  // must be fired every second with playhead starting from 0 for the first segment (or with seconds since 1970-01-01 00:00:00 in case of livestream)&lt;br /&gt;
&lt;br /&gt;
... /*** pass playhead every second ***/&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
&lt;br /&gt;
// MIDROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', midrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition); // must be fired every second with playhead starting from 0&lt;br /&gt;
&lt;br /&gt;
... /*** pass playhead every second ***/&lt;br /&gt;
  &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', lastPlayheadPosition);  // end mid-roll stream&lt;br /&gt;
nSdkInstance.ggPM('stop', stopPlayheadPosition);  // stopPlayheadPosition = lastPlayheadPosition&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition); // must be fired every second with playhead starting from where it left off before mid-roll (or with seconds since 1970-01-01 00:00:00 in case of livestream)&lt;br /&gt;
&lt;br /&gt;
... /*** pass playhead every second ***/&lt;br /&gt;
 &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', lastPlayheadPosition); &lt;br /&gt;
nSdkInstance.ggPM('end', endPlayheadPosition);  // has to be called here at the end of the content&lt;br /&gt;
// endPlayheadPosition = lastPlayheadPosition&lt;br /&gt;
 &lt;br /&gt;
// POSTROLL&lt;br /&gt;
nSdkInstance.ggPM('loadmetadata', postrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);  // must be fired every second with playhead starting from 0&lt;br /&gt;
&lt;br /&gt;
... /*** pass playhead every second ***/&lt;br /&gt;
 &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', lastPlayheadPosition); // end post-roll stream&lt;br /&gt;
// END OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('stop', stopPlayheadPosition);  // stopPlayheadPosition = lastPlayheadPosition&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* 'setPlayheadPosition' is used for calculating duration and must be passed every second. The final playhead position must be sent for the current asset being played before calling 'stop', 'end', or 'loadmetadata'.&lt;br /&gt;
&lt;br /&gt;
* after an 'end' in case there is a new content played, there is a need to have another 'loadmetadata' again.&lt;br /&gt;
&lt;br /&gt;
* For Ad, events must be called for each individual Ad. Each Ad playhead position should begin at ‘0’ when ad starts.&lt;br /&gt;
&lt;br /&gt;
* When content has resumed following an ad break, the playhead position update must continue where previous content segment left off. The playhead position should be passed as a rounded number with no decimals.&lt;br /&gt;
&lt;br /&gt;
* For pre-roll ads you have to call the loadMetadata event for content at the start of stream and after the preroll&lt;br /&gt;
&lt;br /&gt;
== Nielsen Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into, Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the opt-out option, include the following two items in your privacy policy.&lt;br /&gt;
* A notice that the player includes proprietary measurement software that allows users to contribute to market research.&lt;br /&gt;
* A link to the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/in/en/optout.html.&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click &amp;quot;Choices&amp;quot; to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen Online Measurement, click a link to receive an opt-out cookie.&lt;br /&gt;
&lt;br /&gt;
The following paragraph is a template for an opt-out statement.&lt;br /&gt;
&lt;br /&gt;
''The properties may feature Nielsen proprietary measurement software, which will allow users to contribute to market research. To learn more about the information that Nielsen software may collect and your choices with regard to it, please see the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/in/en/optout.html.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Opt Back In====&lt;br /&gt;
&lt;br /&gt;
Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, their opt-out cookie will be deleted and they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
Following Nielsen testing, users need to make a couple of updates to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
# '''Debug Logging''': Disable logging by deleting &amp;lt;code&amp;gt;{nol_sdkDebug: 'debug'}&amp;lt;/code&amp;gt; from initialization call.&lt;br /&gt;
&lt;br /&gt;
====Example Production Initialization Call ====&lt;br /&gt;
Refer to the production initialization call below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;P14273221-CF5C-46BF-A832-994AEFB73AA4&amp;quot;, &amp;quot;myPlayerName&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note''': before going live you have to inform Nielsen - this is necessary, because Nielsen team has to adjust internal configuration parameter to enable data collection. Without that notification no data will be collected and no data will be reported.&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Simplified_SDK_API&amp;diff=3088</id>
		<title>Simplified SDK API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Simplified_SDK_API&amp;diff=3088"/>
		<updated>2018-12-13T15:31:08Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for live stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI vs StandardAPI New.jpg|icon]]&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
''For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).''&lt;br /&gt;
&lt;br /&gt;
''For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.''&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
xCode|&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
'''Configuring Xcode Development Environment''' &lt;br /&gt;
&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nielsen App SDK is compatible with Apple iOS versions 8.0 and above.&lt;br /&gt;
&lt;br /&gt;
The SDK uses the NSURLSession instead of the deprecated NSURLConnection.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Importing Frameworks'''&amp;lt;/big&amp;gt;&lt;br /&gt;
The first step is to ensure that the following frameworks and libraries are imported into the Frameworks folder of the Xcode project before creating an instance of the Nielsen App SDK object.&lt;br /&gt;
* UIKit.framework&lt;br /&gt;
* Foundation.framework&lt;br /&gt;
* AdSupport.framework&lt;br /&gt;
* JavascriptCore.framework&lt;br /&gt;
* WebKit.framework&lt;br /&gt;
* SystemConfiguration.framework&lt;br /&gt;
* Security.framework&lt;br /&gt;
** Nielsen Analytics framework makes use of a number of functions in this library.&lt;br /&gt;
* AVFoundation.framework&lt;br /&gt;
* NielsenAppApi.framework&lt;br /&gt;
* libc++.tbd (as SDK contains Objective C++ source file)&lt;br /&gt;
** Alternatively, include -lstdc++ in Build Settings → Other Linker Flag of the Xcode project&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Example'''&lt;br /&gt;
* Extract “NielsenAppApi.Framework” from the Nielsen App SDK sample app and copy it to Frameworks folder of the Xcode project.&lt;br /&gt;
* Add the code &amp;lt;code&amp;gt;-#import NielsenAppApi/NielsenAppApi.h&amp;lt;/code&amp;gt; to the View Controller’s header file.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Ensure that the following are included in the Linked Frameworks and Libraries list (located in the project’s Summary settings).&lt;br /&gt;
* Nielsen App SDK&lt;br /&gt;
* iOS security framework&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Using Swift'''&amp;lt;/big&amp;gt;&lt;br /&gt;
To import a set of Objective-C files in the same app target as your Swift code, you rely on an Objective-C bridging header to expose those files to Swift. Xcode offers to create this header file when you add a Swift file to an existing Objective-C app, or an Objective-C file to an existing Swift app.&lt;br /&gt;
&lt;br /&gt;
Select File/New File/Objective-C File  &amp;lt;br /&amp;gt;&lt;br /&gt;
Xcode will prompt you to create a bridging header.&lt;br /&gt;
[[File:bridgingheader 2x.png|600px|center]] &amp;lt;br /&amp;gt;&lt;br /&gt;
Once this file has been created, you need to add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Using Objective-C'''&amp;lt;/big&amp;gt;&lt;br /&gt;
Add the code &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 to the View Controller’s header file.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
|Android =&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type, provided by the Nielsen Technical Account Manager (TAM). &lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;dcr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|containerID || View ID of the UI element used as player view in application for Viewability ||Client-defined||No||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [&lt;br /&gt;
  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;dcr&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;,&lt;br /&gt;
            &amp;quot;containerId&amp;quot;: String(containerId)   //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code: ViewController&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        &lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Objective-C Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;dcr&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;INFO&amp;quot;,&lt;br /&gt;
                            @&amp;quot;containerId&amp;quot;: @&amp;quot;1&amp;quot; };  //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NielsenInit.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ViewController.m file could then contain the following line(s):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;  &lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
/////&lt;br /&gt;
-(void) setPlayHeadPosition {&lt;br /&gt;
    &lt;br /&gt;
    //Setting play head position&lt;br /&gt;
    CMTime timeInterval = CMTimeMakeWithSeconds(1, 1);&lt;br /&gt;
    [player addPeriodicTimeObserverForInterval:(timeInterval) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){&lt;br /&gt;
        NSTimeInterval seconds = CMTimeGetSeconds(time);&lt;br /&gt;
        NSInteger intSec = seconds;&lt;br /&gt;
        NSString* strSec = [NSString stringWithFormat:@&amp;quot;%li&amp;quot;, intSec];&lt;br /&gt;
        &lt;br /&gt;
        //updating playHead position in dictionary.&lt;br /&gt;
        [mutableData setValue:strSec forKey:@&amp;quot;playheadPosition&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //Sending data dictionary to SDK with updated playHead position.&lt;br /&gt;
        [nielsenEventTracker trackEvent:mutableData];&lt;br /&gt;
    }];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android = &lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;INFO&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;containerId&amp;quot;, &amp;quot;55&amp;quot;);      //Keep container id unique constant, you can use tag property of player.&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
xCode|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
- (void)trackEvent:(NSDictionary *)data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void trackEvent(JSONObject data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UTC&amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, UTC timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or UTC timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is UTC timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ++&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ✓&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or UTC timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is UTC timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value or UTC timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is UTC timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds ott information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
ottData:{&lt;br /&gt;
ottStatus:1,&lt;br /&gt;
ottType:casting,&lt;br /&gt;
ottDevice:chromecast,&lt;br /&gt;
ottDeviceName:Google ChromeCast,&lt;br /&gt;
ottDeviceID:1234,&lt;br /&gt;
ottDeviceModel:ChromeCast,&lt;br /&gt;
ottDeviceVersion:1.0.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (86400 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;86400&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the '''adldx value''', and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account the Nielsen Simplified API will support a new parameter for ad metadata: '''adIdx.''' This parameter is just an index of an individual ad in a sequence of ads. Once the next ad is started the '''adIdx''' parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type identifier	|| &amp;lt;code&amp;gt; &amp;quot;static&amp;quot; &amp;lt;/code&amp;gt; ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned for each article/section	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|section || Unique Value assigned to page/site section || HomePage || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA ||name of program (25 character limit) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B || custom || &lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C || custom || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;static&amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
                &amp;quot;section&amp;quot;: &amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;AID885-9984&amp;quot;,&lt;br /&gt;
                &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together ===&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
      func loadPreRollAd() -&amp;gt; [String : Any] {&lt;br /&gt;
        &lt;br /&gt;
        //Loading Ad data&lt;br /&gt;
        &lt;br /&gt;
        url = NSURL(string: &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        let content = [&lt;br /&gt;
            &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
            &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
            &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
           &lt;br /&gt;
        let staticObj = [&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
            &amp;quot;section&amp;quot;:&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
            &amp;quot;segA&amp;quot;:&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
            &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
            &amp;quot;segC&amp;quot;:&amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        let ad = [&lt;br /&gt;
            &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
            &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
            &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        let metadata = [&lt;br /&gt;
            &amp;quot;content&amp;quot; : content,&lt;br /&gt;
            &amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
            &amp;quot;static&amp;quot; : staticObj&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        let data = [&lt;br /&gt;
            &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
            &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
            &amp;quot;playheadPosition&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
        &lt;br /&gt;
        return data    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
#import &amp;quot;SDKMethods.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SDKMethods&lt;br /&gt;
//Loading content Data&lt;br /&gt;
- (NSDictionary *)loadContentData&lt;br /&gt;
{&lt;br /&gt;
- (NSDictionary *)loadPreRollAd&lt;br /&gt;
{&lt;br /&gt;
    self.url = [NSURL URLWithString:@&amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    //We should pass content dictionary also in Ad video.&lt;br /&gt;
    NSDictionary *content = @{  @&amp;quot;assetName&amp;quot;:@&amp;quot;ChromeCast1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;assetid&amp;quot;:@&amp;quot;C77664&amp;quot;,&lt;br /&gt;
                                @&amp;quot;length&amp;quot;:@&amp;quot;3600&amp;quot;,&lt;br /&gt;
                                @&amp;quot;program&amp;quot;:@&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                                @&amp;quot;segC&amp;quot;:@&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
                                @&amp;quot;title&amp;quot;:@&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
                                @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,&lt;br /&gt;
                                @&amp;quot;section&amp;quot;:@&amp;quot;app_Mainpage&amp;quot;,&lt;br /&gt;
                                @&amp;quot;airdate&amp;quot;:@&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
                                @&amp;quot;isfullepisode&amp;quot;:@&amp;quot;y&amp;quot;,&lt;br /&gt;
                                @&amp;quot;adloadtype&amp;quot;:@&amp;quot;2&amp;quot;,&lt;br /&gt;
                                @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel 1&amp;quot;,&lt;br /&gt;
                                @&amp;quot;pipMode&amp;quot;:@&amp;quot;false&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *ad = @{ @&amp;quot;assetid&amp;quot;:@&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
                          @&amp;quot;title&amp;quot;:@&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
                          @&amp;quot;type&amp;quot;:@&amp;quot;preroll&amp;quot;,&lt;br /&gt;
                          @&amp;quot;length&amp;quot;:@&amp;quot;20&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
   NSDictionary *staticObj = @{ @&amp;quot;type&amp;quot;:@&amp;quot;static&amp;quot;,&lt;br /&gt;
                               @&amp;quot;section&amp;quot;:@&amp;quot;homeSection&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segA&amp;quot;:@&amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segB&amp;quot;:@&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
                               @&amp;quot;segC&amp;quot;:@&amp;quot;CustomSegmentValueC&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    //static data should be empty in Ad video&lt;br /&gt;
    NSDictionary *metadata = @{  @&amp;quot;content&amp;quot; : content,&lt;br /&gt;
                                 @&amp;quot;ad&amp;quot; : ad,&lt;br /&gt;
                                 @&amp;quot;static&amp;quot; :  @staticObj };&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *data = @{  @&amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
                             @&amp;quot;event&amp;quot;: @&amp;quot;playhead&amp;quot;,&lt;br /&gt;
                             @&amp;quot;type&amp;quot;: @&amp;quot;ad&amp;quot;,&lt;br /&gt;
                             @&amp;quot;playheadPosition&amp;quot;: @&amp;quot;0&amp;quot; };&lt;br /&gt;
    &lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android = &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   //Loading Ad data&lt;br /&gt;
    public JSONObject loadPreRollAdData(){&lt;br /&gt;
        JSONObject data = null;&lt;br /&gt;
&lt;br /&gt;
        url = &amp;quot;http://www.nielseninternet.com/NWCC-3002/prog_index.m3u8&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //We should pass content dictionary also in Ad video.&lt;br /&gt;
            JSONObject content = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;assetName&amp;quot;,&amp;quot;ChromeCast1&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;assetid&amp;quot;,&amp;quot;C77664&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;length&amp;quot;,&amp;quot;3600&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;program&amp;quot;,&amp;quot;MyProgram&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;title&amp;quot;,&amp;quot;S2,E3&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;section&amp;quot;,&amp;quot;app_Mainpage&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;airdate&amp;quot;,&amp;quot;20180207 10:00:00&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;isfullepisode&amp;quot;,&amp;quot;y&amp;quot;)&lt;br /&gt;
                    .put( &amp;quot;adloadtype&amp;quot;,&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject ad = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;assetid&amp;quot;, &amp;quot;AD12345&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;title&amp;quot;, &amp;quot;ADTestTitle&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;length&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject staticObj = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;,&amp;quot;static&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;section&amp;quot;,&amp;quot;homeSection&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segA&amp;quot;,&amp;quot;CustomSegmentValueA&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segB&amp;quot;,&amp;quot;CustomSegmentValueB&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;segC&amp;quot;,&amp;quot;CustomSegmentValueC&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            JSONObject metaData = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;content&amp;quot;, content)&lt;br /&gt;
                    .put(&amp;quot;ad&amp;quot;, ad)&lt;br /&gt;
                    .put(&amp;quot;static&amp;quot;, staticObj);&lt;br /&gt;
&lt;br /&gt;
            data = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
                    .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;   &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== JSON examples ==&lt;br /&gt;
Additional JSON examples such as:&lt;br /&gt;
* [[JSON examples Simplified API|Static Metadata Only]]&lt;br /&gt;
* [[JSON examples Simplified API|Ad Metadata Example]]&lt;br /&gt;
* [[JSON examples Simplified API|ID3 payload for DTVR]]&lt;br /&gt;
* [[JSON examples Simplified API|Sample Pause Event]]&lt;br /&gt;
* [[JSON examples Simplified API|Sample Complete Event]]&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
iOS|&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. &lt;br /&gt;
|Android= &lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
* URL to this web page should be called from SDK by invoking  userOptOutURLString() and opened in 'WebView' / External browser.&lt;br /&gt;
* If the App SDK returns NULL as Opt-Out URL, handle the exception gracefully and retry later.&lt;br /&gt;
* To retrieve the current Opt-Out status of a device, use the userOptOutURLString() method. &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;swift &amp;quot;&amp;gt;&lt;br /&gt;
public String userOptOutURLString()&lt;br /&gt;
public boolean getOptOutStatus()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Users can opt out or opt back into Nielsen Measurement through the system setting – &amp;quot;Limit Ad Tracking&amp;quot;. The setting can be accessed in the Settings application on any device. User is opted out of Nielsen online measurement research when the &amp;quot;Limit Ad Tracking&amp;quot; setting is enabled.&lt;br /&gt;
&lt;br /&gt;
To ensure GDPR compliance, Nielsen also provides the ability for a publisher to directly control the User's Opt Out status, as long as the Users has not enabled  'Limit Ad Tracking' - which will always take precedent.  This setting (optout:nielsenappsdk://1) provides app level control to ensure GDPR compliance. &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;swift &amp;quot;&amp;gt;&lt;br /&gt;
For Opt-Out: &amp;quot;optout&amp;quot;:&amp;quot;nielsenappsdk://1&amp;quot;&lt;br /&gt;
For Opt-In:  &amp;quot;optout&amp;quot;:&amp;quot;nielsenappsdk://0&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://www.nielsen.com/digitalprivacy for more information&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
== Sample Applications ==&lt;br /&gt;
&lt;br /&gt;
The below sample applications have been designed to show the Simplified API's functionality and are broken into two distinct categories:&lt;br /&gt;
* '''Basic''' - To show the functionality of the Nielsen Simplified API using a standard no-frills player.&lt;br /&gt;
** [[Simplified SDK API-Swift4|Swift 4.0 Sample]]&lt;br /&gt;
** [[Simplified SDK API-Objective-C|Objective-C Sample]]&lt;br /&gt;
** [[Simplified SDK API-Android|Android Studio Example]]&lt;br /&gt;
&lt;br /&gt;
* '''Advanced''' - Nielsen Simplified API integrated into a custom video player.&lt;br /&gt;
** This ships with the SDK Bundle.&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Norway_Audio_App_SDK&amp;diff=3087</id>
		<title>DCR Norway Audio App SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Norway_Audio_App_SDK&amp;diff=3087"/>
		<updated>2018-12-13T15:29:38Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for live stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen software development kit (SDK) is one of multiple frameworks that Nielsen provides to enable measuring linear (live) and on-demand audio and video viewing using desktop computers, mobile devices, OTT devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
xCode|&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
'''Configuring Xcode Development Environment''' &lt;br /&gt;
&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nielsen App SDK is compatible with Apple iOS versions 9.0 and above.&lt;br /&gt;
&lt;br /&gt;
The SDK uses the NSURLSession instead of the deprecated NSURLConnection.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Importing Frameworks'''&amp;lt;/big&amp;gt;&lt;br /&gt;
The first step is to ensure that the following frameworks and libraries are imported into the Frameworks folder of the Xcode project before creating an instance of the Nielsen App SDK object.&lt;br /&gt;
* UIKit.framework&lt;br /&gt;
* Foundation.framework&lt;br /&gt;
* AdSupport.framework&lt;br /&gt;
* SystemConfiguration.framework&lt;br /&gt;
* Security.framework&lt;br /&gt;
** Nielsen Analytics framework makes use of a number of functions in this library.&lt;br /&gt;
* AVFoundation.framework&lt;br /&gt;
** This framework is mandatory for the iOS SDK version 5.1.1 to work.&lt;br /&gt;
* CoreLocation.framework &lt;br /&gt;
* CoreMedia.framework&lt;br /&gt;
* NielsenAppApi.framework&lt;br /&gt;
* libc++.tbd (as SDK contains Objective C++ source file)&lt;br /&gt;
** Alternatively, include -lstdc++ in Build Settings → Other Linker Flag of the Xcode project&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Example'''&lt;br /&gt;
* Extract “NielsenAppApi.Framework” from the Nielsen App SDK sample app and copy it to Frameworks folder of the Xcode project.&lt;br /&gt;
* Add the code &amp;lt;code&amp;gt;-#import NielsenAppApi/NielsenAppApi.h&amp;lt;/code&amp;gt; to the View Controller’s header file.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Ensure that the following are included in the Linked Frameworks and Libraries list (located in the project’s Summary settings).&lt;br /&gt;
* Nielsen App SDK&lt;br /&gt;
* iOS security framework&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Using Swift'''&amp;lt;/big&amp;gt;&lt;br /&gt;
To import a set of Objective-C files in the same app target as your Swift code, you rely on an Objective-C bridging header to expose those files to Swift. Xcode offers to create this header file when you add a Swift file to an existing Objective-C app, or an Objective-C file to an existing Swift app.&lt;br /&gt;
&lt;br /&gt;
Select File/New File/Objective-C File  &amp;lt;br /&amp;gt;&lt;br /&gt;
Xcode will prompt you to create a bridging header.&lt;br /&gt;
[[File:bridgingheader 2x.png|600px|center|link=]] &amp;lt;br /&amp;gt;&lt;br /&gt;
Once this file has been created, you need to add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Using Objective-C'''&amp;lt;/big&amp;gt;&lt;br /&gt;
Add the code &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 to the View Controller’s header file.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
|Android =&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the ''com.nielsen.app.sdk'' package) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The Nielsen App SDK 1.2 library is composed of two parts:&lt;br /&gt;
* The Java AppSdk.jar library that runs on the Android’s Dalvik Virtual Machine.&lt;br /&gt;
* The C/C++ libAppSdk.so native library that runs directly on the device’s hardware.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': App SDK 4.0.0 contains AppSDK.jar component only and does not support C/C++ libAppSdk.so components.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Ensure to unzip the Nielsen App SDK sample app and copy the ''AppSdk.jar'' into the libs/ folder on the App’s Eclipse project. Copy the ''libAppSdk.so'' file under ''libs/armeabi/'' folder into the same Eclipse project.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture; the respective ''libAppSdk.so'' can be found under the ''libs/x86/'', ''libs/mips/'', and ''libs/armeabi-7a/'' folders.&lt;br /&gt;
Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   Download the latest ''google-play-services_lib'' and include it in the App’s project in order to use the App SDK.&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
To include the Google Play library in the media player project, copy the ''google-play-services_lib'' folder into the same location as the project&lt;br /&gt;
* Access '''File &amp;gt; Import'''.&lt;br /&gt;
* Select '''Existing Android Code into Workspace''' and click '''Next'''.&lt;br /&gt;
* Click '''Browse''' and navigate to the ''google-play-services_lib'' to include it into the projects.&lt;br /&gt;
* Select the exact '''Project Build Target''' for Eclipse to use from Android SDK.&lt;br /&gt;
** Android 4.4.2, etc. OR&lt;br /&gt;
** Edit ''project.properties'' file to point to Android target version e.g. target= android-19.&lt;br /&gt;
Once the google-play-services_lib is included into the App project, include the following code under the &amp;lt;code&amp;gt;&amp;lt;application&amp;gt;&amp;lt;/code&amp;gt; node in the &amp;lt;code&amp;gt;AndroidManifest.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data android:name=&amp;quot;com.google.android.gms.version&amp;quot; android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, include the ''version.xml'' file that comes with the ''google-play-services_lib'' under the res/values directory of the media player project.&lt;br /&gt;
* Once the files are in place, import com.nielsen.app.sdk to the java source code and start accessing the public interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Library'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;Classes/package&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
* When four SDK instances exist, you must destroy an old instance before creating a new one.&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that can be passed via the AppInfo JSON schema.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). The appid is a GUID data type and is specific to the application.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required/Obligatory? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen. It is GUID data type.|| Nielsen-specified || ✓ || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Release version of the client app. Not needed anymore.|| custom ||  || 0.1.1&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''Norway RAM integrations'''&lt;br /&gt;
* &amp;quot;nor&amp;quot;&lt;br /&gt;
|| Nielsen-specified || ✓ || &amp;quot;nor&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_devDebug || Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|| Nielsen-specified || required until cretification/going live || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift  = &lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
class NielsenInit: NSObject {&lt;br /&gt;
    class func createNielsenAppApi(delegate: NielsenAppApiDelegate) -&amp;gt; NielsenAppApi?{&lt;br /&gt;
    let appInformation:[String: String] = [&lt;br /&gt;
           &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-XXXX-XXXX-2A788BCXXXCA&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;nor&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        return NielsenAppApi(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code using AVPlayer.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
class ViewController: UIViewController, NielsenAppApiDelegate, AVPictureInPictureControllerDelegate, CLLocationManagerDelegate  {&lt;br /&gt;
    &lt;br /&gt;
    let avPlayerViewController = AVPlayerViewController()&lt;br /&gt;
    var avPlayer:AVPlayer?&lt;br /&gt;
    var nielsenAppApi: NielsenAppApi!&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
&lt;br /&gt;
        self.nielsenAppApi = NielsenInit.createNielsenAppApi(delegate: self)&lt;br /&gt;
        NSLog(&amp;quot;Nielsen SDK initialized&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Objective C = &lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;    &lt;br /&gt;
#import &amp;quot;NlsAppApiFactory.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NlsAppApiFactory&lt;br /&gt;
&lt;br /&gt;
+ (NielsenAppApi *)createNielsenAppApiWithDelegate:(id&amp;lt;NielsenAppApiDelegate&amp;gt;)delegate;&lt;br /&gt;
{&lt;br /&gt;
    NSDictionary *appInformation = @{&lt;br /&gt;
                                     @&amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-XXXX-XXXX-2A788BCXXXCA&amp;quot;,&lt;br /&gt;
                                     @&amp;quot;sfcode&amp;quot;: &amp;quot;nor&amp;quot;,&lt;br /&gt;
                                     @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;DEBUG&amp;quot;&lt;br /&gt;
                                     };&lt;br /&gt;
    return [[NielsenAppApi alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following would be the &amp;lt;code&amp;gt;NlsAppApiFactory.h&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenAppApi;&lt;br /&gt;
@protocol NielsenAppApiDeligate;&lt;br /&gt;
&lt;br /&gt;
@interface NlsAppApiFactory : NSObject &lt;br /&gt;
&lt;br /&gt;
+ (NielsenAppAPI *) createNielsenAppApiWithDelegate:(id&amp;lt;NielsenAppApiDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android = &lt;br /&gt;
&lt;br /&gt;
[[AppSDK()]] is no longer a singleton object and should be initialized as below.&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
  // Prepare AppSdk configuration object (JSONObject)&lt;br /&gt;
  JSONObject appSdkConfig = new JSONObject()&lt;br /&gt;
          .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-XXXX-XXXX-2A788BCXXXCA&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;sfcode&amp;quot;, &amp;quot;nor&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;DEBUG&amp;quot;); // only for debug builds&lt;br /&gt;
&lt;br /&gt;
// Pass appSdkConfig to the AppSdk constructor&lt;br /&gt;
mAppSdk = new AppSdk(appContext, appSdkConfig, appSdkListener);&lt;br /&gt;
}&lt;br /&gt;
catch (JSONException e)&lt;br /&gt;
{&lt;br /&gt;
  Log.e(TAG, &amp;quot;Couldn’t prepare JSONObject for appSdkConfig&amp;quot;, e);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here, &amp;lt;code&amp;gt;appContext&amp;lt;/code&amp;gt; is the App context object and &amp;lt;code&amp;gt;appSdkConfig&amp;lt;/code&amp;gt; is JSON object for holding the parameters (&amp;lt;code&amp;gt;appid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sfcode&amp;lt;/code&amp;gt;) the App passes to the Nielsen App SDK via a JSON string. The appid is obtained from Nielsen operational support and is unique to the app.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The integration of Nielsen App SDK will depend on type of client app.&amp;lt;br /&amp;gt;&lt;br /&gt;
* Ensure that SDK files (AppSdk.jar and libAppSdk.so [App SDK 1.2 Only]) are included under the App’s project and the App SDK is linked to the App (the setting to link App SDK to the App can be found on property page of the App’s project).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
== Configure Payload ==&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
All the SDK methods handles only two types of objects: NSString, NSDictionary. The parameters passed must be either a JSON formatted string or a NSDictionary object. The JSON passed in the SDK must be well-formed.&lt;br /&gt;
* NSDictionary object&lt;br /&gt;
** If an object of unexpected type is passed to the method, the error message will be logged.&lt;br /&gt;
** If string has invalid JSON format, the error message will be logged.&lt;br /&gt;
* JSON value must be string value.&lt;br /&gt;
** This includes boolean and numeric values. For example, a value of true should be represented with &amp;quot;true&amp;quot;, number value 123 should be &amp;quot;123&amp;quot;.&lt;br /&gt;
** All the Variable Names like appid, appname, sfcode, dataSrc, title, type etc. are case-sensitive. Use the correct variable name as specified in the documentation.&lt;br /&gt;
* JSON string can be prepared using either raw NSString or serialized NSDictionary.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
let channelInfo = [&lt;br /&gt;
    &amp;quot;channelName&amp;quot;: &amp;quot;My Channel Name 1&amp;quot;,&lt;br /&gt;
];&lt;br /&gt;
        &lt;br /&gt;
let contentMetadata = [&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;isAudio&amp;quot;: &amp;quot;true&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;: &amp;quot;88675545&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Program S3, EP1&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;: &amp;quot;n&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;: &amp;quot;Program Name&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;: &amp;quot;3600&amp;quot;, &lt;br /&gt;
    &amp;quot;airdate&amp;quot;: &amp;quot;20171020 10:05:00&amp;quot;,&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
NSDictionary  *channelInfo = @{&lt;br /&gt;
    @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel Name 1&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
NSDictionary *contentMetadata = @{&lt;br /&gt;
    @&amp;quot;type&amp;quot;: @&amp;quot;content&amp;quot;,&lt;br /&gt;
    @&amp;quot;isAudio&amp;quot;: @&amp;quot;true&amp;quot;,&lt;br /&gt;
    @&amp;quot;assetid&amp;quot;: [NSString stringWithFormat:@&amp;quot;ProgramAssetId-%d&amp;quot;, i],&lt;br /&gt;
    @&amp;quot;length&amp;quot;: @&amp;quot;3600&amp;quot;,&lt;br /&gt;
    @&amp;quot;program&amp;quot;, &amp;quot;Program Name&amp;quot;,&lt;br /&gt;
    @&amp;quot;title&amp;quot;: @&amp;quot;Program S3, EP1&amp;quot;,&lt;br /&gt;
    @&amp;quot;isfullepisode&amp;quot;: @&amp;quot;y&amp;quot;,&lt;br /&gt;
    @&amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
    @&amp;quot;airdate&amp;quot;: &amp;quot;20161013 20:00:00&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android = &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JSONObject channelInfo = new JSONObject()&lt;br /&gt;
    .put(&amp;quot;channelname&amp;quot;, &amp;quot;My Channel Name 1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
JSONObject contentMetadata = new JSONObject()&lt;br /&gt;
//SDK Metadata&lt;br /&gt;
    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;isAudio&amp;quot;, &amp;quot;true&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;assetid&amp;quot;, &amp;quot;vid345-67483&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;program&amp;quot;, &amp;quot;Program Name&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;title&amp;quot;, &amp;quot;Program S3, EP1&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;length&amp;quot;, &amp;quot;3600&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;isfullepisode&amp;quot;, &amp;quot;y&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;adloadtype&amp;quot;, &amp;quot;2&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;airdate&amp;quot;, &amp;quot;20161013 20:00:00&amp;quot;)&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;   &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Configure metadata === &lt;br /&gt;
When starting a streaming session a channel info metadata object needs to be passed to the SDK containing a channelName. The name should remain constant throughout the completion of an episode or live stream.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !!	Values	 !! Required&lt;br /&gt;
|-&lt;br /&gt;
| channelName	|| Any string representing the channel/stream	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content metadata ===&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required/Obligatory&lt;br /&gt;
|-&lt;br /&gt;
| type || type of asset || &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; || ✓&lt;br /&gt;
|-&lt;br /&gt;
| isAudio || indicate measurement of audio ads or audio content || &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; || ✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset (64 character limit)|| custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| program ||(string) name of program (254 character limit) || custom || ✓&lt;br /&gt;
|-&lt;br /&gt;
| title ||(string) episode title (max 254 characters) || custom || ✓&lt;br /&gt;
|-&lt;br /&gt;
| length || length of content in seconds || &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (&amp;quot;0&amp;quot; for 24/7 Livestream if only one assetid is used for the whole stream. If reporting on program level, length of the program. For Event-Livestreams planned length. For on-demand stream length) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| airdate || the airdate in the linear over-the-air broadcast || Supported formats are:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
&lt;br /&gt;
YYYY-MM-DDHH:MI:SS&lt;br /&gt;
&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS+xx:xx&lt;br /&gt;
&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS-xx:xx&lt;br /&gt;
&lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
&lt;br /&gt;
MM/DD/YYYY &lt;br /&gt;
|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| scheduledEndDate || the airdate when this particular asset ended in the linear over-the-air broadcast || should be same format as airdate || ✓&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || full episode flag || &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode || ✓&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || type of ad load:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt; Linear – matches over-the-air ad load&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
|| &amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; - DCR measures content with dynamic ads || ✓&lt;br /&gt;
|-&lt;br /&gt;
| stationType	|| OTA station flag and/or OTA station type&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt; Custom station built per user&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt; OTA streaming station with the same adload&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; OTA station with a different ad load&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;3&amp;quot;&amp;lt;/code&amp;gt; Multicast eRadio or online station&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;4&amp;quot;&amp;lt;/code&amp;gt; On Demand Audio(podcasting)	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|-&lt;br /&gt;
| stationId	|| (string) name of the channel || custom||✓&lt;br /&gt;
|-&lt;br /&gt;
| clientid	|| &lt;br /&gt;
parent ID – value is automatically populated through provided App ID.&amp;lt;br/&amp;gt;&lt;br /&gt;
In order to override the brand configured to the App ID, pass parent &amp;lt;br/&amp;gt;&lt;br /&gt;
value here and the sub-brand ID associated to that brand in the subbrand &amp;lt;br/&amp;gt;&lt;br /&gt;
key (e.g. multiple brands in App)	&lt;br /&gt;
||&lt;br /&gt;
provided by Nielsen	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| subbrand	|| vcid/sub-brand ID – value is automatically populated through provided&amp;lt;br/&amp;gt;&lt;br /&gt;
App ID. In order to override the sub-brand configured to the App ID, value can &amp;lt;br/&amp;gt;&lt;br /&gt;
be passed here (e.g. multiple sub-brands in App). clientId does not need to be provided.&lt;br /&gt;
||&lt;br /&gt;
provided by Nielsen	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| progen	|| (string) genre information (max 254 characters) &lt;br /&gt;
||&lt;br /&gt;
custom	&lt;br /&gt;
||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configure API Calls ==&lt;br /&gt;
=== Sample API Sequence ===&lt;br /&gt;
A Sample API sequence could follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
|On App Start||&amp;lt;code&amp;gt;[nielsenMeter loadMetadata: contentMetadata];&amp;lt;/code&amp;gt; || // contentMetadata Object contains the JSON metadata for the impression&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;[nielsenMeter play: channelInfo];&amp;lt;/code&amp;gt; || // channelInfo contains JSON metadata of channel name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[nielsenMeter loadMetadata: contentMetadataObject];&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| Content || &amp;lt;code&amp;gt;[nielsenMeter playheadPosition: position];&amp;lt;/code&amp;gt; || // playheadPosition is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;[nielsenMeter end];&amp;lt;/code&amp;gt; || // Content playback is completed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Life cycle of SDK instance ===&lt;br /&gt;
Life cycle of SDK instance includes four general states:&lt;br /&gt;
# '''Initial state''' – The SDK is not initialized and hence, not ready to process playing information. Once the SDK is moved out of this state, it needs instantiation of the new SDK instance in order to get the instance in the '''Initial state'''.&lt;br /&gt;
# '''Idle state''' – The SDK is initialized and is ready to process playing information. Once Initialized, the SDK instance is not processing any data, but is listening for the play event to occur.&lt;br /&gt;
# '''Processing state''' – The SDK instance is processing playing information. [[play]] and [[loadMetadata]] calls move the SDK instance into this state. In this state, the SDK instance will be able to process the following calls.&lt;br /&gt;
## [[playheadPosition]] – Call this API every one second when playhead position timer is fired.&lt;br /&gt;
## [[stop]] – Call this API when the playback is paused, switches between content and ad (within the same content playback) or encounters interruptions.&lt;br /&gt;
## [[end]] – SDK instance exits from Processing state when this API is called.&lt;br /&gt;
# '''Disabled state''' – The SDK instance is disabled and is not processing playing information. SDK instance moves into this state in one of the following scenarios.&lt;br /&gt;
## Initialization fails&lt;br /&gt;
## &amp;lt;code&amp;gt;appDisableApi&amp;lt;/code&amp;gt; is called&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
@property (assign) BOOL appDisableApi;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' The App SDK will fire data pings and continue measurement even after the user has opted out from Nielsen measurement on a device. The data ping will be marked as opted-out ping.&lt;br /&gt;
&lt;br /&gt;
'''Note''': In case of any interruptions during playback due to alarm, calendar, call, flight mode, Wi-Fi toggle, channel change, etc., call [[stop]] to stop the measurement.&lt;br /&gt;
* As soon as the playback resumes, call [[play]], [[loadMetadata]] and  [[playheadPosition]].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API Call sequence ===&lt;br /&gt;
==== Use Case 1: Content has no Advertisements ====&lt;br /&gt;
Call [[play()]] with channelName JSON as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;channelName&amp;quot;: &amp;quot;My Channel Name 1&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Call [[loadMetadata()]] with JSON metadata for content as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
  &amp;quot;isAudio&amp;quot;: &amp;quot;true&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;stream345-67483&amp;quot;,&lt;br /&gt;
  &amp;quot;program&amp;quot;: &amp;quot;ProgramName&amp;quot;,&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Program S3, EP1&amp;quot;,&lt;br /&gt;
  &amp;quot;length&amp;quot;: &amp;quot;3600&amp;quot;,&lt;br /&gt;
  ...&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Call [[setPlayheadPosition()]] every one second until a pause / stop.&lt;br /&gt;
Use the sample API sequence below as a reference to identify the specific events that need to be called during content playback without ads.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;mAppSdk.play(channelInfo); &amp;lt;/code&amp;gt; || // channelInfo contains JSON metadata of channel name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| Content || &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;mAppSdk.end();&amp;lt;/code&amp;gt; || // Content playback is completed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Use Case 2: Content has Advertisements ====&lt;br /&gt;
Call [[play()]] with channelName JSON as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;channelName&amp;quot;: &amp;quot;My Channel Name 1&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Call [[loadMetadata()]] with JSON metadata for ad as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
   &amp;quot;assetid&amp;quot;: &amp;quot;ad=123&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: In case the individual ad details are not available, send ad pod (presence) details through the [[loadMetadata]] and playhead position through [[playheadPosition]].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Call [[setPlayheadPosition()]] every one second until a pause / stop / another [[loadMetadata()]] is called. Playhead should be passed for the entire duration of ad pod, if the ad pod details are passed as part of [[loadMetadata()]].&lt;br /&gt;
&lt;br /&gt;
The sample API sequence can be used as a reference to identify the specific events that need to be called during content and ad playback.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;mAppSdk.play(channelInfo); &amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Preroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(prerollMetadataObject);&amp;lt;/code&amp;gt; || // prerollMetadataObject contains the JSON metadata for the preroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the preroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after preroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Content || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after the content is paused (ad starts)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | Midroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(midrollMetaDataObject);&amp;lt;/code&amp;gt; || // midrollMetadataObject contains the JSON metadata for the midroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the midroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // App moves to background(midroll pauses) &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(midrollMetaDataObject);&amp;lt;/code&amp;gt; || // App moves to foreground (midroll resumes) &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // playheadPosition is position of the playhead while the midroll ad is being played &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after midroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Content (End of stream) || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Always call stop irrespective of postroll is followed or not&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;mAppSdk.end();&amp;lt;/code&amp;gt; || // Call end() at the end of content&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Postroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(postrollMetaDataObject);&amp;lt;/code&amp;gt; || // postrollMetadataObject contains the JSON metadata for the postroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the postroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after postroll occurs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: Each Ad playhead should reset or begin from 0 at ad start. When content has resumed following an ad break, playhead position must continue from where previous content segment was left off.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sequence of Calls ===&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
Use [[play]] to pass the channel information containing the channelName parameter when the streaming session starts.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; - (void)play:(id)channelInfo;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android = &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public void play(JSONObject channelInfo);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Swift = &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;nielsenAppApi?.play(channelInfo);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== loadMetadata ===&lt;br /&gt;
The loadMetadata function is used to inform the SDK about new content. The contentMetadata object passed in should contain the values as described above.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;– (void)loadMetadata:(id)contentMetadata;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android = &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public void loadMetadata(JSONObject contentMetadata);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Swift = &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;self.nielsenAppApi?.loadMetadata(contentMetadata)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== playheadPosition ===&lt;br /&gt;
Use playheadPosition to tell the SDK about the current position in the stream. For live content this should be the Unix timestamp (seconds since Jan-1-1970 UTC). For on-demand content, simply the position in seconds in the stream.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
– (void) playheadPosition: (long long) playheadPos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sending playheadposition for content ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
AVPlayer *player;&lt;br /&gt;
CMTime curTime=[player currentTime];&lt;br /&gt;
int pos = CMTimeGetSeconds(curTime);&lt;br /&gt;
[nAppApiObject playheadPosition:pos];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Swift = &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
        //Monitor the Playhead position of the AVPlayer&lt;br /&gt;
        let timeInterval: CMTime = CMTimeMakeWithSeconds(1.0,10)&lt;br /&gt;
        self.avPlayerViewController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            if self.avPlayerViewController.player!.currentItem?.status == .readyToPlay {&lt;br /&gt;
                let time : Float64 = self.avPlayerViewController.player!.currentTime().seconds;&lt;br /&gt;
                let pos = Int64(time);&lt;br /&gt;
                NSLog(&amp;quot;New Elapse Time = \(time)&amp;quot;);&lt;br /&gt;
                self.nielsenAppApi?.playheadPosition(pos);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android = &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void setPlayheadPosition(long position);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== stop ===&lt;br /&gt;
Tell the SDK that content playback has stopped.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;– (void) stop;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android = &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public void stop();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Swift = &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;self.nielsenAppApi?.stop();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== end ===&lt;br /&gt;
When content stop is initiated and content cannot be resumed from the same position. For example when the stream has reached its end or in situations where it can only be restarted from the beginning.&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;- (void) end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Android = &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public void end();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Swift = &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;self.nielsenAppApi?.end();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Interruptions during playback ==&lt;br /&gt;
As part of integrating Nielsen App SDK with the player application, the Audio / Video app developer needs to handle the following possible interruption scenarios:&lt;br /&gt;
* Pause / Play&lt;br /&gt;
* Network Loss (Wi-Fi / Airplane / Cellular)&lt;br /&gt;
* Call Interrupt (SIM or Third party Skype / Hangout call)&lt;br /&gt;
* Alarm Interrupt&lt;br /&gt;
* Content Buffering&lt;br /&gt;
* Device Lock / Unlock (For Audio players only if audio stops playing)&lt;br /&gt;
* App going in the Background/Foreground (For Audio players only if audio stops playing)&lt;br /&gt;
* Channel / Station Change Scenario&lt;br /&gt;
* Unplugging of headphone&lt;br /&gt;
In case of encountering one of the above interruptions, the player application needs to&lt;br /&gt;
* Call [[stop]] immediately (except when content is buffering) and withhold sending playhead position.&lt;br /&gt;
* Start sending pings – [[loadMetadata]] and [[playheadPosition]] for the new viewing session, once the playback resumes.&lt;br /&gt;
Please see the [[Digital Measurement FAQ]] for more details&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
&lt;br /&gt;
iOS| &lt;br /&gt;
== iOS Opt-Out Implementation ==&lt;br /&gt;
To opt out, users must have access to the page referenced by the opt-out url provided by the SDK. User can click this page from app settings screen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
*URL for the Nielsen Privacy web page should be retrieved from the optOutURL property of the SDK object &amp;lt;code&amp;gt;optOutURL&amp;lt;/code&amp;gt; and opened in 'WebView' / External browser.&lt;br /&gt;
*If the App SDK returns NULL in the optOutURL, handle the exception gracefully and retry later.&lt;br /&gt;
*To retrieve the current Opt-Out status of a device, use the [[optOutStatus]] method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Displaying Opt-Out in a WebView ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;NielsenAppApi nAppApiObject;&lt;br /&gt;
@property(strong) UIWebView *optOutView;&lt;br /&gt;
&lt;br /&gt;
// create WebView and set self as delegate&lt;br /&gt;
self.optOutView=[[UIWebViewalloc]initWithFrame:self.view.bounds];&lt;br /&gt;
&lt;br /&gt;
self.optOutView.scalesPageToFit = yes;&lt;br /&gt;
// get Nielsen defined web address and load the page&lt;br /&gt;
NSString *webAddress = nAppApiObject.optOutURL;&lt;br /&gt;
&lt;br /&gt;
if(webAddress == nil)&lt;br /&gt;
    { // Handle it gracefully and retry later}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
    [optOutView loadRequest:[NSURLRequest requestWithURL:webAddress]];&lt;br /&gt;
    // show the view to the user&lt;br /&gt;
    [self.view addSubview:optOutView];&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The app must provide access to &amp;quot;About Nielsen Measurement&amp;quot; page for the users. Include &amp;quot;About Nielsen Measurement&amp;quot; and Your Choices link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
[[File:App optout en1.png|link=]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*URL to this web page should be called from SDK and opened in 'WebView' / External browser.&lt;br /&gt;
*If the App SDK returns NULL as Opt-Out URL, handle this case and retry later.&lt;br /&gt;
*To retrieve the current Opt-Out status, use the [[optOutStatus]] property from Nielsen's SDK API.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
@property (readonly) BOOL optOutStatus;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*App should provide a UI control like 'close' or 'back' button to close the 'WebView' / External browser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Users can opt out or opt back into Nielsen Measurement. Opt-Out feature relies on iOS' system setting – &amp;quot;Limit Ad Tracking&amp;quot;. The setting can be accessed in the Settings application on any iOS device: '''Settings → Privacy → Advertising → Limit Ad Tracking'''.&lt;br /&gt;
&lt;br /&gt;
User is opted out of Nielsen online measurement research when the &amp;quot;Limit Ad Tracking&amp;quot; setting is enabled.&lt;br /&gt;
&lt;br /&gt;
[[File:Opt-Out iOS.jpg|link=]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' The App SDK will fire data pings and continue measurement even after the user has opted out from Nielsen measurement on a device. The data ping will be marked as opted-out ping.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|Android = &lt;br /&gt;
== Android Opt-Out Implementation ==&lt;br /&gt;
To opt out, users must have access to page referenced by the opt-out url provided by the SDK. User can click this page from app settings screen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
*URL to this web page should be called from SDK by invoking &amp;lt;code&amp;gt;userOptOutURLString()&amp;lt;/code&amp;gt; and opened in 'WebView' / External browser.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public String userOptOutURLString()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*If the App SDK returns NULL as Opt-Out URL, handle the exception gracefully and retry later.&lt;br /&gt;
*To retrieve the current Opt-Out status of a device, use the &amp;lt;code&amp;gt; getOptOutStatus() &amp;lt;/code&amp;gt; method.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public boolean getOptOutStatus()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Displaying Opt-Out in a WebView ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
optOutUrl = mAppSdk.userOptOutURLString();&lt;br /&gt;
if(optOutUrl !=null)&lt;br /&gt;
{&lt;br /&gt;
   mWebView = (WebView) findViewById(R.id.webView);&lt;br /&gt;
   mWebView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;
   mWebView.getSettings().setBuiltInZoomControls(true);&lt;br /&gt;
   mWebView.getSettings().setDisplayZoomControls(false);&lt;br /&gt;
   mWebView.getSettings().setLoadWithOverviewMode(true);&lt;br /&gt;
   mWebView.getSettings().setUseWideViewPort(true);&lt;br /&gt;
   mWebView.setWebViewClient(new MonitorWebView());&lt;br /&gt;
   mWebView.setWebChromeClient(new WebChromeClient());&lt;br /&gt;
   mWebView.loadUrl(optOutUrl);&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
   //Handle it gracefully and Retry later&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The app must provide access to &amp;quot;About Nielsen Measurement&amp;quot; page for the users. Include &amp;quot;About Nielsen Measurement&amp;quot; and Your Choices link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
[[File:Privacy policy App.png|link=]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' When ‘WebView’ / External browser is closed, do not pass the status returned from ‘WebView’ / External browser to the SDK within the app, as the new Opt-Out page will not return any response.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' App SDK manages the user’s choice (Opt-Out / Opt-In), the app does not need to manage this status.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
*SDK will be sending the data pings to census even though the user opted out. However, all the outgoing pings will have the parameter uoo=true using which backend can ignore this data.&lt;br /&gt;
*Current Opt-Out page is now updated to have no hyperlinks for Opt-Out / Opt-In operations. SDK Opt-Out has to be done via&lt;br /&gt;
'''Google Settings → Ads → Opt out of Ads Personalization'''.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' For Amazon devices, see [[#Opt-Out Implementation for Amazon Devices|Opt-Out Implementation for Amazon Devices]] below.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:andr-ads.jpg|link=]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' The App SDK will fire data pings and continue measurement even after the user has opted out from Nielsen measurement on a device. The data ping will be marked as opted-out ping.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Opt-Out Implementation for Amazon Devices ==&lt;br /&gt;
Amazon device users can opt out or opt back into Nielsen Measurement, any time using the device’s setting – 'Limit Ad Tracking' (Interest-based ads).&lt;br /&gt;
&lt;br /&gt;
User is opted out of Nielsen Online Measurement when ‘Limit Ad Tracking’ is enabled.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''For devices running on Fire OS 5.1 and above, retrieve the Ad tracking value.'''&lt;br /&gt;
=== Retrieving Ad tracking Value ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
ContentResolver cr = getContentResolver();&lt;br /&gt;
int limitAdTracking = Secure.getInt(cr, &amp;quot;limit_ad_tracking&amp;quot;, 2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
*Returns limit_ad_tracking value &amp;quot;0&amp;quot; if enabled&lt;br /&gt;
*Returns limit_ad_tracking value &amp;quot;1&amp;quot; if disabled&lt;br /&gt;
*Returns limit_ad_tracking value &amp;quot;2&amp;quot; if ad tracking is not supported (below Fire OS 5.1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' Google Play Services are not needed to retrieve ad tracking state on Amazon devices. Limit Ad Tracking can be accessed through '''Settings → Apps &amp;amp; Games → Advertising ID'''.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
Following Nielsen testing, users need to make one update to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
&lt;br /&gt;
# '''Debug Logging''': Disable logging by deleting &amp;lt;code&amp;gt;{nol_devDebug: 'DEBUG'}&amp;lt;/code&amp;gt; from initialization call.&lt;br /&gt;
#* '''Example Production Initialization Call''' - Refer to the production initialization call below:&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;iOS Example:&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
class NielsenInit: NSObject {&lt;br /&gt;
    class func createNielsenAppApi(delegate: NielsenAppApiDelegate) -&amp;gt; NielsenAppApi?{&lt;br /&gt;
    let appInformation:[String: String] = [&lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;nor&amp;quot;&lt;br /&gt;
            // Remove Flag:   &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        return NielsenAppApi(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;Android Example:&amp;lt;/big&amp;gt;''' &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
  // Prepare AppSdk configuration object (JSONObject)&lt;br /&gt;
  JSONObject appSdkConfig = new JSONObject()&lt;br /&gt;
          .put(&amp;quot;appid&amp;quot;, &amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;sfcode&amp;quot;, &amp;quot;nor&amp;quot;)&lt;br /&gt;
            // Remove Flag:   &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Pass appSdkConfig to the AppSdk constructor&lt;br /&gt;
mAppSdk = new AppSdk(appContext, appSdkConfig, appSdkListener);&lt;br /&gt;
}&lt;br /&gt;
catch (JSONException e)&lt;br /&gt;
{&lt;br /&gt;
  Log.e(TAG, &amp;quot;Couldn’t prepare JSONObject for appSdkConfig&amp;quot;, e);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note''': before going live you have to inform Nielsen team - this is necessary, because Nielsen team has to adjust internal configuration parameter to enable data collection. Without that notification no data will be collected and no data will be reported.&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_India_Video_iOS_SDK&amp;diff=3086</id>
		<title>DCR India Video iOS SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_India_Video_iOS_SDK&amp;diff=3086"/>
		<updated>2018-12-13T15:26:52Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for live stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring live (beam) and on-demand (stream) content viewing using TVs, mobile devices, etc.&lt;br /&gt;
&lt;br /&gt;
This document is specific to the Custom Implementation for BARC.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
'''Configuring Xcode Development Environment''' &lt;br /&gt;
&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nielsen App SDK is compatible with Apple iOS versions 9.0 and above.&lt;br /&gt;
&lt;br /&gt;
The SDK uses the NSURLSession instead of the deprecated NSURLConnection.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': All communications between the SDK and the Census (Collection Facility) use HTTPS.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Importing Frameworks'''&amp;lt;/big&amp;gt;&lt;br /&gt;
The first step is to ensure that the following frameworks and libraries are imported into the Frameworks folder of the Xcode project before creating an instance of the Nielsen App SDK object.&lt;br /&gt;
* UIKit.framework&lt;br /&gt;
* Foundation.framework&lt;br /&gt;
* AdSupport.framework&lt;br /&gt;
* SystemConfiguration.framework&lt;br /&gt;
* Security.framework&lt;br /&gt;
** Nielsen Analytics framework makes use of a number of functions in this library.&lt;br /&gt;
* AVFoundation.framework&lt;br /&gt;
** This framework is mandatory for the iOS SDK version 5.1.1 to work.&lt;br /&gt;
* CoreLocation.framework&lt;br /&gt;
* CoreMedia.framework&lt;br /&gt;
* NielsenAppApi.framework&lt;br /&gt;
* libc++.tbd (as SDK contains Objective C++ source file)&lt;br /&gt;
** Alternatively, include -lstdc++ in Build Settings → Other Linker Flag of the Xcode project&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Example'''&lt;br /&gt;
* Extract “NielsenAppApi.Framework” from the Nielsen App SDK sample app and copy it to Frameworks folder of the Xcode project.&lt;br /&gt;
* Add the code &amp;lt;code&amp;gt;-#import NielsenAppApi/NielsenAppApi.h&amp;lt;/code&amp;gt; to the View Controller’s header file.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Ensure that the following are included in the Linked Frameworks and Libraries list (located in the project’s Summary settings).&lt;br /&gt;
* Nielsen App SDK&lt;br /&gt;
* iOS security framework&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Using Swift'''&amp;lt;/big&amp;gt;&lt;br /&gt;
To import a set of Objective-C files in the same app target as your Swift code, you rely on an Objective-C bridging header to expose those files to Swift. Xcode offers to create this header file when you add a Swift file to an existing Objective-C app, or an Objective-C file to an existing Swift app.&lt;br /&gt;
&lt;br /&gt;
Select File/New File/Objective-C File  &amp;lt;br /&amp;gt;&lt;br /&gt;
Xcode will prompt you to create a bridging header.&lt;br /&gt;
[[File:bridgingheader 2x.png|600px|center|link=]] &amp;lt;br /&amp;gt;&lt;br /&gt;
Once this file has been created, you need to add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Using Objective-C'''&amp;lt;/big&amp;gt;&lt;br /&gt;
Add the code &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 to the View Controller’s header file.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
* When four SDK instances exist, you must destroy an old instance before creating a new one.&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that can be passed via the AppInfo JSON schema.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). The appid is a GUID data type and is specific to the application.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required/Obligatory? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen. It is GUID data type.|| Nielsen-specified || ✓ || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No || Nielsen Sample App&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
|| Nielsen-specified || ✓ || &amp;quot;bc&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_devDebug || Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|| Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
Swift 4.0 Example:&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
class NielsenInit: NSObject {&lt;br /&gt;
    class func createNielsenAppApi(delegate: NielsenAppApiDelegate) -&amp;gt; NielsenAppApi?{&lt;br /&gt;
    let appInformation:[String: String] = [&lt;br /&gt;
           &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-XXXX-XXXX-2A788BCXXXCA&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;app name here&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;bc&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        return NielsenAppApi(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample code using AVPlayer.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
class ViewController: UIViewController, NielsenAppApiDelegate, AVPictureInPictureControllerDelegate, CLLocationManagerDelegate  {&lt;br /&gt;
    &lt;br /&gt;
    let avPlayerViewController = AVPlayerViewController()&lt;br /&gt;
    var avPlayer:AVPlayer?&lt;br /&gt;
    var nielsenAppApi: NielsenAppApi!&lt;br /&gt;
&lt;br /&gt;
  override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
&lt;br /&gt;
self.nielsenAppApi = NielsenInit.createNielsenAppApi(delegate: self)&lt;br /&gt;
NSLog(&amp;quot;Nielsen SDK initialized&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
== Configure Payload ==&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
All the SDK methods handles only two types of objects: NSString, NSDictionary. The parameters passed must be either a JSON formatted string or a NSDictionary object. The JSON passed in the SDK must be well-formed.&lt;br /&gt;
* NSDictionary object&lt;br /&gt;
** If an object of unexpected type is passed to the method, the error message will be logged.&lt;br /&gt;
** If string has invalid JSON format, the error message will be logged.&lt;br /&gt;
* JSON value must be string value.&lt;br /&gt;
** This includes boolean and numeric values. For example, a value of true should be represented with &amp;quot;true&amp;quot;, number value 123 should be &amp;quot;123&amp;quot;.&lt;br /&gt;
** All the Variable Names like appid, appname, sfcode, dataSrc, title, type etc. are case-sensitive. Use the correct variable name as specified in the documentation.&lt;br /&gt;
* JSON string can be prepared using either raw NSString or serialized NSDictionary.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
       let channelInfo = [&lt;br /&gt;
            &amp;quot;channelName&amp;quot;: &amp;quot;My Channel Name 1&amp;quot;,&lt;br /&gt;
];&lt;br /&gt;
        &lt;br /&gt;
        let contentMetadata = [&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
                &amp;quot;assetid&amp;quot;: &amp;quot;88675545&amp;quot;,&lt;br /&gt;
                &amp;quot;title&amp;quot;: &amp;quot;Program S3, EP1&amp;quot;,&lt;br /&gt;
                &amp;quot;isfullepisode&amp;quot;: &amp;quot;n&amp;quot;,&lt;br /&gt;
                &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
                &amp;quot;SegmentB&amp;quot;: &amp;quot;custom&amp;quot;,&lt;br /&gt;
                &amp;quot;SegmentC&amp;quot;: &amp;quot;custom&amp;quot;,&lt;br /&gt;
                &amp;quot;program&amp;quot;: &amp;quot;Program Name&amp;quot;,&lt;br /&gt;
                &amp;quot;length&amp;quot;: &amp;quot;3600&amp;quot; ,&lt;br /&gt;
                &amp;quot;nol_c0&amp;quot;: &amp;quot;bc_lang,0001&amp;quot;,&lt;br /&gt;
                &amp;quot;nol_c1&amp;quot;: &amp;quot;bc_adsupport,Y&amp;quot;,&lt;br /&gt;
                &amp;quot;nol_c2&amp;quot;: &amp;quot;bc_ugc,Y&amp;quot;,&lt;br /&gt;
                &amp;quot;nol_c4&amp;quot;: &amp;quot;bc_sub,S&amp;quot;,&lt;br /&gt;
                &amp;quot;nol_c5&amp;quot;: &amp;quot;bc_download,S&amp;quot;,&lt;br /&gt;
                &amp;quot;nol_c7&amp;quot;: &amp;quot;bc_ccat,6&amp;quot;,&lt;br /&gt;
               &amp;quot;nol_c8&amp;quot;: &amp;quot;bc_cgenre,N1&amp;quot;,&lt;br /&gt;
               &amp;quot;nol_c9&amp;quot;: &amp;quot;bc_do,D&amp;quot;,&lt;br /&gt;
               &amp;quot;nol_c10&amp;quot;: &amp;quot;bc_dname,A123&amp;quot;,&lt;br /&gt;
               &amp;quot;nol_c11&amp;quot;: &amp;quot;bc_altype,1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure metadata === &lt;br /&gt;
channelName should remain constant throughout the completion of an episode or live stream.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !!	Values	 !! Required&lt;br /&gt;
|-&lt;br /&gt;
| channelName	|| Any string representing the channel/stream	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata should remain constant throughout the completion of an episode / clip including the ads play.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (25 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (40 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;	full episode flag&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;	&amp;quot;y&amp;quot;- full episode, &amp;quot;n&amp;quot;- non full episode&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ad model only pass value as 2&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 2&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom Parameters for Analytical Reporting Only ===&lt;br /&gt;
The below values will not be part of standard reporting and designed for custom analytical reporting only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Example !!Required/Obligatory&lt;br /&gt;
|-&lt;br /&gt;
| bc_lang  || 	Language of the content        || [[BARC_Custom_Codes|Language Code]] (64 codes)      ||  &amp;lt;code&amp;gt;'0001'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_adsupport  ||  Ad Supported Flag     || &amp;lt;code&amp;gt;'Y' or 'N'&amp;lt;/code&amp;gt;         ||  &amp;lt;code&amp;gt;'Y'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_ugc  ||	User Generated Content    || &amp;lt;code&amp;gt;'Y' or 'N'&amp;lt;/code&amp;gt;           ||  &amp;lt;code&amp;gt;'Y'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_sub  ||  Subscribed or Free     ||  &amp;lt;code&amp;gt;'S' or 'F'&amp;lt;/code&amp;gt;          ||  &amp;lt;code&amp;gt;'S'&amp;lt;/code&amp;gt;     ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_download  || Downloaded or Streamed content       || &amp;lt;code&amp;gt;'D' or 'S'&amp;lt;/code&amp;gt;         ||   &amp;lt;code&amp;gt;'D' &amp;lt;/code&amp;gt;    ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_ccat  || Content code      || [[BARC_Custom_Codes|ContentTypeID]] (10 codes)    ||  &amp;lt;code&amp;gt;'6'&amp;lt;/code&amp;gt;   ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_cgenre  || Genre       ||  [[BARC_Custom_Codes|BARC Custom Codes]] (81 codes)  ||  'F12'    ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_do  || Distributor or Owner    || &amp;lt;code&amp;gt;'D' or 'O'&amp;lt;/code&amp;gt;         ||  &amp;lt;code&amp;gt;'Y'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_dname  || Distributor name      || BARC Predefined numeric/alphanumeric value      ||  'A123'  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_altype  || Ad load type    || &amp;lt;code&amp;gt;'1' or '2' or '3'&amp;lt;/code&amp;gt;         ||  &amp;lt;code&amp;gt;'1'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note:''' nol_c3 and nol_c6 must not be set!&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example Content Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var content_metadata_object = {  &lt;br /&gt;
  // SDK&lt;br /&gt;
  type:      'content',&lt;br /&gt;
  assetid:   'VID123-123456',&lt;br /&gt;
  program:   'program name',&lt;br /&gt;
  title:     'episode title',&lt;br /&gt;
  length:    '543',&lt;br /&gt;
  isfullepisode: 'n',&lt;br /&gt;
  adloadtype:'2',&lt;br /&gt;
  &lt;br /&gt;
 //Custom Properties for Analysis&lt;br /&gt;
// Examples only&lt;br /&gt;
  nol_c0:  'bc_lang,0001',&lt;br /&gt;
  nol_c1:  'bc_adsupport,Y'&lt;br /&gt;
  nol_c2:  'bc_ugc,Y',&lt;br /&gt;
  nol_c4:  'bc_sub,S',&lt;br /&gt;
  nol_c5:  'bc_download,S',&lt;br /&gt;
  nol_c7:  'bc_ccat,6',&lt;br /&gt;
  nol_c8:  'bc_cgenre,N1',&lt;br /&gt;
  nol_c9:  'bc_do,D',&lt;br /&gt;
  nol_c10: 'bc_dname,A123',&lt;br /&gt;
  nol_c11: 'bc_altype,1'&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Ad Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var adMetadataObject = &lt;br /&gt;
{  &lt;br /&gt;
  assetid: 'AD-1',&lt;br /&gt;
  type:    'preroll'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt; URL Character Limit: There is a URL character limit of 2K characters due to browser limitations. Exceeding this value could impair data delivery on particular browsers. &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure API Calls  ==&lt;br /&gt;
[[File:appsdkTimeline-BARC2.png|icon]]&lt;br /&gt;
=== Life cycle of SDK instance ===&lt;br /&gt;
Life cycle of SDK instance includes four general states:&lt;br /&gt;
# '''Initial state''' – The SDK is not initialized and hence, not ready to process playing information. Once the SDK is moved out of this state, it needs instantiation of the new SDK instance in order to get the instance in the '''Initial state'''.&lt;br /&gt;
# '''Idle state''' – The SDK is initialized and is ready to process playing information. Once Initialized, the SDK instance is not processing any data, but is listening for the play event to occur.&lt;br /&gt;
# '''Processing state''' – The SDK instance is processing playing information. [[#play|play]] and [[#Content_Metadata|loadMetadata]] calls move the SDK instance into this state. In this state, the SDK instance will be able to process the following calls.&lt;br /&gt;
## [[#play|playheadPosition]] – Call this API every one second when playhead position timer is fired.&lt;br /&gt;
## [[#stop|stop]] – Call this API when the playback is paused, switches between content and ad (within the same content playback) or encounters interruptions.&lt;br /&gt;
## [[#play|end]] – SDK instance exits from Processing state when this API is called.&lt;br /&gt;
# '''Disabled state''' – The SDK instance is disabled and is not processing playing information. SDK instance moves into this state in one of the following scenarios.&lt;br /&gt;
## Initialization fails&lt;br /&gt;
## &amp;lt;code&amp;gt;appDisableApi&amp;lt;/code&amp;gt; is called&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Note''': In case of any interruptions during playback due to alarm, calendar, call, flight mode, Wi-Fi toggle, channel change, etc., call [[#stop|stop]] to stop the measurement.&lt;br /&gt;
* As soon as the playback resumes, call [[#play|play]],  [[#Content_Metadata|loadMetadata]]  and  [[playheadPosition]].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API Call sequence ===&lt;br /&gt;
==== Use Case 1: Content has no Advertisements ====&lt;br /&gt;
Call [[#play|play()]] with channelName JSON as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;channelName&amp;quot;: &amp;quot;TheMovieTitle&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call [[#Content_Metadata|loadMetadata()]]  with JSON metadata for content as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;vid345-67483&amp;quot;,&lt;br /&gt;
  &amp;quot;program&amp;quot;: &amp;quot;ProgramName&amp;quot;,&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Program S3, EP1&amp;quot;,&lt;br /&gt;
  &amp;quot;length&amp;quot;: &amp;quot;3600&amp;quot;,&lt;br /&gt;
  ...&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call [[setPlayheadPosition()]] every one second until a pause / stop.&lt;br /&gt;
Use the sample API sequence below as a reference to identify the specific events that need to be called during content playback without ads.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;mAppSdk.play(channelName); &amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel/video name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| Content || &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;mAppSdk.end();&amp;lt;/code&amp;gt; || // Content playback is completed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Use Case 2: Content has Advertisements ====&lt;br /&gt;
Call [[#play|play()]] with channelName JSON as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;channelName&amp;quot;: &amp;quot;TheMovieTitle&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call  [[#Content_Metadata|loadMetadata()]]  with JSON metadata for ad as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
   &amp;quot;assetid&amp;quot;: &amp;quot;ad=123&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: In case the individual ad details are not available, send ad pod (presence) details through the [[#Content_Metadata|loadMetadata]]  and playhead position through [[playheadPosition]].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Call [[setPlayheadPosition()]] every one second until a pause / stop / another  [[#Content_Metadata|loadMetadata()]]  is called. Playhead should be passed for the entire duration of ad pod, if the ad pod details are passed as part of  [[#Content_Metadata|loadMetadata()]]. &lt;br /&gt;
&lt;br /&gt;
The sample API sequence can be used as a reference to identify the specific events that need to be called during content and ad playback.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;mAppSdk.play(channelName); &amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel/video name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Preroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(prerollMetadataObject);&amp;lt;/code&amp;gt; || // prerollMetadataObject contains the JSON metadata for the preroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the preroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after preroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Content || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after the content is paused (ad starts)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | Midroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(midrollMetaDataObject);&amp;lt;/code&amp;gt; || // midrollMetadataObject contains the JSON metadata for the midroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the midroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // App moves to background(midroll pauses) &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(midrollMetaDataObject);&amp;lt;/code&amp;gt; || // App moves to foreground (midroll resumes) &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // playheadPosition is position of the playhead while the midroll ad is being played &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after midroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Content (End of stream) || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Always call stop irrespective of postroll is followed or not&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;mAppSdk.end();&amp;lt;/code&amp;gt; || // Call end() at the end of content&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Postroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(postrollMetaDataObject);&amp;lt;/code&amp;gt; || // postrollMetadataObject contains the JSON metadata for the postroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the postroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after postroll occurs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: Each Ad playhead should reset or begin from 0 at ad start. When content has resumed following an ad break, playhead position must continue from where previous content segment was left off.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sequence Examples ===&lt;br /&gt;
The example code below will differ from your production application.  Provided to assist in explaining how to implement.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
Use [[#play|play]] to pass the channel descriptor information through channelName parameter when the user taps the '''Play''' button on the player.&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;nielsenAppApi?.play(JSONObject channelInfo);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loadMetadata ===&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;self.nielsenAppApi?.loadMetadata(contentMetadata)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== playheadPosition/setPlayheadPosition ===&lt;br /&gt;
Please note: iOS sdk uses playheadPosition.  Android uses setPlayheadPosition.&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
        //Monitor the Playhead position of the AVPlayer&lt;br /&gt;
        let timeInterval: CMTime = CMTimeMakeWithSeconds(1.0,10)&lt;br /&gt;
        self.avPlayerViewController.player?.addPeriodicTimeObserver(forInterval: timeInterval, queue: DispatchQueue.main) {(elapsedTime: CMTime) -&amp;gt; Void in&lt;br /&gt;
            if self.avPlayerViewController.player!.currentItem?.status == .readyToPlay {&lt;br /&gt;
                let time : Float64 = self.avPlayerViewController.player!.currentTime().seconds;&lt;br /&gt;
                let pos = Int64(time);&lt;br /&gt;
                NSLog(&amp;quot;New Elapse Time = \(time)&amp;quot;);&lt;br /&gt;
                self.nielsenAppApi?.playheadPosition(pos);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//Live streaming:&lt;br /&gt;
var pos: TimeInterval&lt;br /&gt;
pos = Date().timeIntervalSince1970&lt;br /&gt;
self.nielsenAppApi?.playheadPosition(Int64(pos))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== stop ===&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;self.nielsenAppApi?.stop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== end ===&lt;br /&gt;
When content stop is initiated and content cannot be resumed from the same position (it can only be restarted from the beginning of stream).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;self.nielsenAppApi?.end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interruptions during playback ==&lt;br /&gt;
As part of integrating Nielsen App SDK with the player application, the Audio / Video app developer needs to handle the following possible interruption scenarios:&lt;br /&gt;
* Pause / Play&lt;br /&gt;
* Network Loss (Wi-Fi / Airplane / Cellular)&lt;br /&gt;
* Call Interrupt (SIM or Third party Skype / Hangout call)&lt;br /&gt;
* Alarm Interrupt&lt;br /&gt;
* Content Buffering&lt;br /&gt;
* Device Lock / Unlock (Video players only, not for Audio players)&lt;br /&gt;
* App going in the Background/Foreground (Video players only, not for Audio players)&lt;br /&gt;
* Channel / Station Change Scenario&lt;br /&gt;
* Unplugging of headphone&lt;br /&gt;
In case of encountering one of the above interruptions, the player application needs to&lt;br /&gt;
* Call [[#stop|stop]] immediately (except when content is buffering) and withhold sending playhead position.&lt;br /&gt;
* Start sending pings – [[#loadMetadata|loadMetadata]] and [[playheadPosition]] for the new viewing session, once the playback resumes.&lt;br /&gt;
Please see the [[Digital Measurement FAQ]] for more details&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple:]&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
* URL to this web page should be called from SDK by invoking  userOptOutURLString() and opened in 'WebView' / External browser.&lt;br /&gt;
* If the App SDK returns NULL as Opt-Out URL, handle the exception gracefully and retry later.&lt;br /&gt;
* To retrieve the current Opt-Out status of a device, use the userOptOutURLString() method. &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;swift &amp;quot;&amp;gt;&lt;br /&gt;
public String userOptOutURLString()&lt;br /&gt;
public boolean getOptOutStatus()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Users can opt out or opt back into Nielsen Measurement. Opt-Out feature relies on the system setting – &amp;quot;Limit Ad Tracking&amp;quot;. The setting can be accessed in the Settings application on any device. User is opted out of Nielsen online measurement research when the &amp;quot;Limit Ad Tracking&amp;quot; setting is enabled.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research. Please see http://www.nielsen.com/digitalprivacy for more information&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
Following Nielsen testing, users need to make one update to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
&lt;br /&gt;
# '''Debug Logging''': Disable logging by deleting &amp;lt;code&amp;gt;{nol_sdkDebug: 'DEBUG'}&amp;lt;/code&amp;gt; from initialization call.&lt;br /&gt;
#* '''Example Production Initialization Call''' - Refer to the production initialization call below:&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;iOS Example:&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
class NielsenInit: NSObject {&lt;br /&gt;
    class func createNielsenAppApi(delegate: NielsenAppApiDelegate) -&amp;gt; NielsenAppApi?{&lt;br /&gt;
    let appInformation:[String: String] = [&lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;bc&amp;quot;&lt;br /&gt;
            // Remove Flag:   &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        return NielsenAppApi(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;Android Example:&amp;lt;/big&amp;gt;''' &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
  // Prepare AppSdk configuration object (JSONObject)&lt;br /&gt;
  JSONObject appSdkConfig = new JSONObject()&lt;br /&gt;
          .put(&amp;quot;appid&amp;quot;, &amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;sfcode&amp;quot;, &amp;quot;bc&amp;quot;)&lt;br /&gt;
            // Remove Flag:   &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Pass appSdkConfig to the AppSdk constructor&lt;br /&gt;
mAppSdk = new AppSdk(appContext, appSdkConfig, appSdkListener);&lt;br /&gt;
}&lt;br /&gt;
catch (JSONException e)&lt;br /&gt;
{&lt;br /&gt;
  Log.e(TAG, &amp;quot;Couldn’t prepare JSONObject for appSdkConfig&amp;quot;, e);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note''': before going live you have to inform Nielsen team - this is necessary, because Nielsen team has to adjust internal configuration parameter to enable data collection. Without that notification no data will be collected and no data will be reported.&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_India_Video_Android_SDK&amp;diff=3085</id>
		<title>DCR India Video Android SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_India_Video_Android_SDK&amp;diff=3085"/>
		<updated>2018-12-13T15:26:24Z</updated>

		<summary type="html">&lt;p&gt;YaminiKumawat: changed 86400 to 0 for live stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring live (beam) and on-demand (stream) content viewing using TVs, mobile devices, etc.&lt;br /&gt;
&lt;br /&gt;
This document is specific to the Custom Implementation for BARC.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode and Android using Android Studio.&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Configuring Android Development Environment'''&amp;lt;/big&amp;gt;'&lt;br /&gt;
*The Nielsen App SDK (located in the ''com.nielsen.app.sdk'' package) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The Nielsen App SDK 1.2 library is composed of two parts:&lt;br /&gt;
* The Java AppSdk.jar library that runs on the Android’s Dalvik Virtual Machine.&lt;br /&gt;
* The C/C++ libAppSdk.so native library that runs directly on the device’s hardware.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': App SDK 4.0.0 contains AppSDK.jar component only and does not support C/C++ libAppSdk.so components.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Ensure to unzip the Nielsen App SDK sample app and copy the ''AppSdk.jar'' into the libs/ folder on the App’s Eclipse project. Copy the ''libAppSdk.so'' file under ''libs/armeabi/'' folder into the same Eclipse project.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture; the respective ''libAppSdk.so'' can be found under the ''libs/x86/'', ''libs/mips/'', and ''libs/armeabi-7a/'' folders.&lt;br /&gt;
Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   Download the latest ''google-play-services_lib'' and include it in the App’s project in order to use the App SDK.&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
To include the Google Play library in the media player project, copy the ''google-play-services_lib'' folder into the same location as the project&lt;br /&gt;
* Access '''File &amp;gt; Import'''.&lt;br /&gt;
* Select '''Existing Android Code into Workspace''' and click '''Next'''.&lt;br /&gt;
* Click '''Browse''' and navigate to the ''google-play-services_lib'' to include it into the projects.&lt;br /&gt;
* Select the exact '''Project Build Target''' for Eclipse to use from Android SDK.&lt;br /&gt;
** Android 4.4.2, etc. OR&lt;br /&gt;
** Edit ''project.properties'' file to point to Android target version e.g. target= android-19.&lt;br /&gt;
Once the google-play-services_lib is included into the App project, include the following code under the &amp;lt;code&amp;gt;&amp;lt;application&amp;gt;&amp;lt;/code&amp;gt; node in the &amp;lt;code&amp;gt;AndroidManifest.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data android:name=&amp;quot;com.google.android.gms.version&amp;quot; android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, include the ''version.xml'' file that comes with the ''google-play-services_lib'' under the res/values directory of the media player project.&lt;br /&gt;
* Once the files are in place, import com.nielsen.app.sdk to the java source code and start accessing the public interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Library'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;Classes/package&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
* When four SDK instances exist, you must destroy an old instance before creating a new one.&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that can be passed via the AppInfo JSON schema.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). The appid is a GUID data type and is specific to the application.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required/Obligatory? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen. It is GUID data type.|| Nielsen-specified || ✓ || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No || Nielsen Sample App&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
|| Nielsen-specified || ✓ || &amp;quot;bc&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_devDebug || Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|| Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
[[AppSDK()]] is no longer a singleton object and should be initialized as below.&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
  // Prepare AppSdk configuration object (JSONObject)&lt;br /&gt;
  JSONObject appSdkConfig = new JSONObject()&lt;br /&gt;
          .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-XXXX-XXXX-2A788BCXXXCA&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;appname&amp;quot;, &amp;quot;Sample App Name&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;sfcode&amp;quot;, &amp;quot;bc&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;DEBUG&amp;quot;); // only for debug builds&lt;br /&gt;
&lt;br /&gt;
// Pass appSdkConfig to the AppSdk constructor&lt;br /&gt;
mAppSdk = new AppSdk(appContext, appSdkConfig, appSdkListener);&lt;br /&gt;
}&lt;br /&gt;
catch (JSONException e)&lt;br /&gt;
{&lt;br /&gt;
  Log.e(TAG, &amp;quot;Couldn’t prepare JSONObject for appSdkConfig&amp;quot;, e);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here, &amp;lt;code&amp;gt;appContext&amp;lt;/code&amp;gt; is the App context object and &amp;lt;code&amp;gt;appSdkConfig&amp;lt;/code&amp;gt; is JSON object for holding the parameters (&amp;lt;code&amp;gt;appid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;appname&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sfcode&amp;lt;/code&amp;gt;) the App passes to the Nielsen App SDK via a JSON string. The appid is obtained from Nielsen operational support and is unique to the app.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The integration of Nielsen App SDK will depend on type of client app.&amp;lt;br /&amp;gt;&lt;br /&gt;
* Ensure that SDK files (AppSdk.jar and libAppSdk.so [App SDK 1.2 Only]) are included under the App’s project and the App SDK is linked to the App (the setting to link App SDK to the App can be found on property page of the App’s project).&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
== Configure Payload ==&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
All the SDK methods handles only two types of objects: NSString, NSDictionary. The parameters passed must be either a JSON formatted string or a NSDictionary object. The JSON passed in the SDK must be well-formed.&lt;br /&gt;
* NSDictionary object&lt;br /&gt;
** If an object of unexpected type is passed to the method, the error message will be logged.&lt;br /&gt;
** If string has invalid JSON format, the error message will be logged.&lt;br /&gt;
* JSON value must be string value.&lt;br /&gt;
** This includes boolean and numeric values. For example, a value of true should be represented with &amp;quot;true&amp;quot;, number value 123 should be &amp;quot;123&amp;quot;.&lt;br /&gt;
** All the Variable Names like appid, appname, sfcode, dataSrc, title, type etc. are case-sensitive. Use the correct variable name as specified in the documentation.&lt;br /&gt;
* JSON string can be prepared using either raw NSString or serialized NSDictionary.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JSONObject channelInfo = new JSONObject()&lt;br /&gt;
    .put(&amp;quot;channelname&amp;quot;,&amp;quot;My Channel Name 1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
JSONObject contentMetadata = new JSONObject()&lt;br /&gt;
//SDK Metadata&lt;br /&gt;
    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;assetid&amp;quot;, &amp;quot;vid345-67483&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;program&amp;quot;, &amp;quot;Program Name&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;title&amp;quot;, &amp;quot;Program S3, EP1&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;length&amp;quot;, &amp;quot;3600&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;isfullepisode&amp;quot;, &amp;quot;y&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;adloadtype&amp;quot;, &amp;quot;2&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;segmentB&amp;quot;, &amp;quot;custom&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;segmentC&amp;quot;, &amp;quot;custom&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c0&amp;quot;,&amp;quot;bc_lang,0001&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c1&amp;quot;,&amp;quot;bc_adsupport,Y&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c2&amp;quot;,&amp;quot;bc_ugc,Y&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c4&amp;quot;,&amp;quot;bc_sub,S&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c5&amp;quot;,&amp;quot;bc_download,S&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c7&amp;quot;,&amp;quot;bc_ccat,6&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c8&amp;quot;,&amp;quot;bc_cgenre,N1&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c9&amp;quot;,&amp;quot;bc_do,D&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c10&amp;quot;,&amp;quot;bc_dname,A123&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c11&amp;quot;,&amp;quot;bc_altype,1&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure metadata === &lt;br /&gt;
channelName should remain constant throughout the completion of an episode or live stream.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !!	Values	 !! Required&lt;br /&gt;
|-&lt;br /&gt;
| channelName	|| Any string representing the channel/stream	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata should remain constant throughout the completion of an episode / clip including the ads play.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (25 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (40 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;	full episode flag&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;	&amp;quot;y&amp;quot;- full episode, &amp;quot;n&amp;quot;- non full episode&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ad model only pass value as 2&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 2&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom Parameters for Analytical Reporting Only ===&lt;br /&gt;
The below values will not be part of standard reporting and designed for custom analytical reporting only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Example !!Required/Obligatory&lt;br /&gt;
|-&lt;br /&gt;
| bc_lang  || 	Language of the content        ||  [[BARC_Custom_Codes|Language Code]] (58 codes)  ||  &amp;lt;code&amp;gt;'0001'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_adsupport  ||  Ad Supported Flag     || &amp;lt;code&amp;gt;'Y' or 'N'&amp;lt;/code&amp;gt;         ||  &amp;lt;code&amp;gt;'Y'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_ugc  ||	User Generated Content    || &amp;lt;code&amp;gt;'Y' or 'N'&amp;lt;/code&amp;gt;           ||  &amp;lt;code&amp;gt;'Y'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_sub  ||  Subscribed or Free     ||  &amp;lt;code&amp;gt;'S' or 'F'&amp;lt;/code&amp;gt;          ||  &amp;lt;code&amp;gt;'S'&amp;lt;/code&amp;gt;     ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_download  || Downloaded or Streamed content       || &amp;lt;code&amp;gt;'D' or 'S'&amp;lt;/code&amp;gt;         ||   &amp;lt;code&amp;gt;'D' &amp;lt;/code&amp;gt;    ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_ccat  || Content code      || [[BARC_Custom_Codes|ContentTypeID]] (10 codes)     ||  &amp;lt;code&amp;gt;'6'&amp;lt;/code&amp;gt;   ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_cgenre  || Genre       ||  [[BARC_Custom_Codes|BARC Custom Codes]] (81 codes)       ||  'F12'    ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_do  || Distributor or Owner    || &amp;lt;code&amp;gt;'D' or 'O'&amp;lt;/code&amp;gt;         ||  &amp;lt;code&amp;gt;'Y'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_dname  || Distributor name      || BARC Predefined numeric/alphanumeric value      ||  'A123'  ||Yes||&lt;br /&gt;
|-&lt;br /&gt;
| bc_altype  || Ad load type    || &amp;lt;code&amp;gt;'1' or '2' or '3'&amp;lt;/code&amp;gt;         ||  &amp;lt;code&amp;gt;'1'&amp;lt;/code&amp;gt;  ||Yes||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note:''' nol_c3 and nol_c6 must not be set!&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example Content Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var content_metadata_object = {  &lt;br /&gt;
  // SDK&lt;br /&gt;
  type:      'content',&lt;br /&gt;
  assetid:   'VID123-123456',&lt;br /&gt;
  program:   'program name',&lt;br /&gt;
  title:     'episode title',&lt;br /&gt;
  length:    '543',&lt;br /&gt;
  isfullepisode: 'n',&lt;br /&gt;
  adloadtype:'2',&lt;br /&gt;
  &lt;br /&gt;
 //Custom Properties for Analysis&lt;br /&gt;
// Examples only&lt;br /&gt;
  nol_c0:  'bc_lang,0001',&lt;br /&gt;
  nol_c1:  'bc_adsupport,Y'&lt;br /&gt;
  nol_c2:  'bc_ugc,Y',&lt;br /&gt;
  nol_c4:  'bc_sub,S',&lt;br /&gt;
  nol_c5:  'bc_download,S',&lt;br /&gt;
  nol_c7:  'bc_ccat,6',&lt;br /&gt;
  nol_c8:  'bc_cgenre,N1',&lt;br /&gt;
  nol_c9:  'bc_do,D',&lt;br /&gt;
  nol_c10:  'bc_dname,A123',&lt;br /&gt;
  nol_c11:  'bc_altype,1'&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Ad Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var adMetadataObject = &lt;br /&gt;
{  &lt;br /&gt;
  assetid: 'AD-1',&lt;br /&gt;
  type:    'preroll'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt; URL Character Limit: There is a URL character limit of 2K characters due to browser limitations. Exceeding this value could impair data delivery on particular browsers. &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure API Calls  ==&lt;br /&gt;
[[File:appsdkTimeline-BARC2.png|icon]]&lt;br /&gt;
=== Life cycle of SDK instance ===&lt;br /&gt;
Life cycle of SDK instance includes four general states:&lt;br /&gt;
# '''Initial state''' – The SDK is not initialized and hence, not ready to process playing information. Once the SDK is moved out of this state, it needs instantiation of the new SDK instance in order to get the instance in the '''Initial state'''.&lt;br /&gt;
# '''Idle state''' – The SDK is initialized and is ready to process playing information. Once Initialized, the SDK instance is not processing any data, but is listening for the play event to occur.&lt;br /&gt;
# '''Processing state''' – The SDK instance is processing playing information. [[#play|play]] and [[#Content_metadata|loadMetadata]] calls move the SDK instance into this state. In this state, the SDK instance will be able to process the following calls.&lt;br /&gt;
## [[#play|playheadPosition]] – Call this API every one second when playhead position timer is fired.&lt;br /&gt;
## [[#play|stop]] – Call this API when the playback is paused, switches between content and ad (within the same content playback) or encounters interruptions.&lt;br /&gt;
## [[#play|end]] – SDK instance exits from Processing state when this API is called.&lt;br /&gt;
# '''Disabled state''' – The SDK instance is disabled and is not processing playing information. SDK instance moves into this state in one of the following scenarios.&lt;br /&gt;
## Initialization fails&lt;br /&gt;
## &amp;lt;code&amp;gt;appDisableApi&amp;lt;/code&amp;gt; is called&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Note''': In case of any interruptions during playback due to alarm, calendar, call, flight mode, Wi-Fi toggle, channel change, etc., call [[stop]] to stop the measurement.&lt;br /&gt;
* As soon as the playback resumes, call [[play]], [[loadMetadata]] and  [[playheadPosition]].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API Call sequence ===&lt;br /&gt;
==== Use Case 1: Content has no Advertisements ====&lt;br /&gt;
Call [[play()]] with channelName JSON as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;channelName&amp;quot;: &amp;quot;TheMovieTitle&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call [[loadMetadata()]] with JSON metadata for content as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;vid345-67483&amp;quot;,&lt;br /&gt;
  &amp;quot;program&amp;quot;: &amp;quot;ProgramName&amp;quot;,&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Program S3, EP1&amp;quot;,&lt;br /&gt;
  &amp;quot;length&amp;quot;: &amp;quot;3600&amp;quot;,&lt;br /&gt;
  ...&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call [[setPlayheadPosition()]] every one second until a pause / stop.&lt;br /&gt;
Use the sample API sequence below as a reference to identify the specific events that need to be called during content playback without ads.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;mAppSdk.play(channelName); &amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel/video name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| Content || &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;mAppSdk.end();&amp;lt;/code&amp;gt; || // Content playback is completed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Use Case 2: Content has Advertisements ====&lt;br /&gt;
Call [[play()]] with channelName JSON as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;channelName&amp;quot;: &amp;quot;TheMovieTitle&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call [[loadMetadata()]] with JSON metadata for ad as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
   &amp;quot;assetid&amp;quot;: &amp;quot;ad=123&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: In case the individual ad details are not available, send ad pod (presence) details through the [[loadMetadata]] and playhead position through [[playheadPosition]].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Call [[setPlayheadPosition()]] every one second until a pause / stop / another [[loadMetadata()]] is called. Playhead should be passed for the entire duration of ad pod, if the ad pod details are passed as part of [[loadMetadata()]].&lt;br /&gt;
&lt;br /&gt;
The sample API sequence can be used as a reference to identify the specific events that need to be called during content and ad playback.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;mAppSdk.play(channelName); &amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel/video name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Preroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(prerollMetadataObject);&amp;lt;/code&amp;gt; || // prerollMetadataObject contains the JSON metadata for the preroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the preroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after preroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Content || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after the content is paused (ad starts)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | Midroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(midrollMetaDataObject);&amp;lt;/code&amp;gt; || // midrollMetadataObject contains the JSON metadata for the midroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the midroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // App moves to background(midroll pauses) &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(midrollMetaDataObject);&amp;lt;/code&amp;gt; || // App moves to foreground (midroll resumes) &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // playheadPosition is position of the playhead while the midroll ad is being played &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after midroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Content (End of stream) || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Always call stop irrespective of postroll is followed or not&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;mAppSdk.end();&amp;lt;/code&amp;gt; || // Call end() at the end of content&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Postroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(postrollMetaDataObject);&amp;lt;/code&amp;gt; || // postrollMetadataObject contains the JSON metadata for the postroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the postroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after postroll occurs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: Each Ad playhead should reset or begin from 0 at ad start. When content has resumed following an ad break, playhead position must continue from where previous content segment was left off.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sequence Examples ===&lt;br /&gt;
The example code below will differ from your production application.  Provided to assist in explaining how to implement.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
Use [[play]] to pass the channel descriptor information through channelName parameter when the user taps the '''Play''' button on the player.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;    public void play(JSONObject channelInfo);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loadMetadata ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public void loadMetadata(JSONObject contentMetadata);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== playheadPosition/setPlayheadPosition ===&lt;br /&gt;
Please note: iOS sdk uses playheadPosition.  Android uses setPlayheadPosition.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void run() {&lt;br /&gt;
       if (mMediaPlayer != null) {&lt;br /&gt;
&lt;br /&gt;
      //getting current position of media player&lt;br /&gt;
     int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;&lt;br /&gt;
&lt;br /&gt;
    seek.setProgress(mCurrentPosition);&lt;br /&gt;
     try {&lt;br /&gt;
       //Checking If video player is not paused and video is playing and is not a DTVR&lt;br /&gt;
           if (!isPaused &amp;amp;&amp;amp; mMediaPlayer.isPlaying() &amp;amp;&amp;amp; videoType != Constants.dtvrVideo) {&lt;br /&gt;
      //Sending playHeadPosition to SDK.&lt;br /&gt;
      appSdk.setPlayheadPosition(mCurrentPosition);&lt;br /&gt;
        }&lt;br /&gt;
       } catch (Exception e) {&lt;br /&gt;
       e.printStackTrace();&lt;br /&gt;
         }&lt;br /&gt;
         }&lt;br /&gt;
    playheadHandler.postDelayed(this, 1000);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
//Live streaming&lt;br /&gt;
Live Streaming :&lt;br /&gt;
Calendar c = Calendar.getInstance();&lt;br /&gt;
long pos = (c.getTimeInMillis()/ 1000);&lt;br /&gt;
if (mAppSdk != null)&lt;br /&gt;
{&lt;br /&gt;
mAppSdk.setPlayheadPosition(pos);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== stop ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;mAppSdk.stop()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== end ===&lt;br /&gt;
When content stop is initiated and content cannot be resumed from the same position (it can only be restarted from the beginning of stream).&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;mAppSdk.end()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interruptions during playback ==&lt;br /&gt;
As part of integrating Nielsen App SDK with the player application, the Audio / Video app developer needs to handle the following possible interruption scenarios:&lt;br /&gt;
* Pause / Play&lt;br /&gt;
* Network Loss (Wi-Fi / Airplane / Cellular)&lt;br /&gt;
* Call Interrupt (SIM or Third party Skype / Hangout call)&lt;br /&gt;
* Alarm Interrupt&lt;br /&gt;
* Content Buffering&lt;br /&gt;
* Device Lock / Unlock (Video players only, not for Audio players)&lt;br /&gt;
* App going in the Background/Foreground (Video players only, not for Audio players)&lt;br /&gt;
* Channel / Station Change Scenario&lt;br /&gt;
* Unplugging of headphone&lt;br /&gt;
In case of encountering one of the above interruptions, the player application needs to&lt;br /&gt;
* Call [[stop]] immediately (except when content is buffering) and withhold sending playhead position.&lt;br /&gt;
* Start sending pings – [[loadMetadata]] and [[playheadPosition]] for the new viewing session, once the playback resumes.&lt;br /&gt;
Please see the [[Digital Measurement FAQ]] for more details&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by making the relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
Users must either have access to the &amp;quot;About Nielsen Measurement&amp;quot; page, or have similar text available within the native app. Include &amp;quot;About Nielsen Measurement&amp;quot; and &amp;quot;Your Choices&amp;quot; link in the Privacy Policy / EULA or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
* URL to this web page should be called from SDK by invoking  userOptOutURLString() and opened in 'WebView' / External browser.&lt;br /&gt;
* If the App SDK returns NULL as Opt-Out URL, handle the exception gracefully and retry later.&lt;br /&gt;
* To retrieve the current Opt-Out status of a device, use the userOptOutURLString() method. &lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;swift &amp;quot;&amp;gt;&lt;br /&gt;
public String userOptOutURLString()&lt;br /&gt;
public boolean getOptOutStatus()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Users can opt out or opt back into Nielsen Measurement. Opt-Out feature relies on the system setting – &amp;quot;Limit Ad Tracking&amp;quot;. The setting can be accessed in the Settings application on any device. User is opted out of Nielsen online measurement research when the &amp;quot;Limit Ad Tracking&amp;quot; setting is enabled.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&lt;br /&gt;
'''&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research. Please see &lt;br /&gt;
http://priv-policy.imrworldwide.com/priv/mobile/in/en/optout.html for more information&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
Following Nielsen testing, users need to make one update to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
&lt;br /&gt;
# '''Debug Logging''': Disable logging by deleting &amp;lt;code&amp;gt;{nol_sdkDebug: 'DEBUG'}&amp;lt;/code&amp;gt; from initialization call.&lt;br /&gt;
#* '''Example Production Initialization Call''' - Refer to the production initialization call below:&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;iOS Example:&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
class NielsenInit: NSObject {&lt;br /&gt;
    class func createNielsenAppApi(delegate: NielsenAppApiDelegate) -&amp;gt; NielsenAppApi?{&lt;br /&gt;
    let appInformation:[String: String] = [&lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;bc&amp;quot;&lt;br /&gt;
            // Remove Flag:   &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
        return NielsenAppApi(appInfo:appInformation, delegate:delegate)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;Android Example:&amp;lt;/big&amp;gt;''' &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
  // Prepare AppSdk configuration object (JSONObject)&lt;br /&gt;
  JSONObject appSdkConfig = new JSONObject()&lt;br /&gt;
          .put(&amp;quot;appid&amp;quot;, &amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;sfcode&amp;quot;, &amp;quot;bc&amp;quot;)&lt;br /&gt;
            // Remove Flag:   &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Pass appSdkConfig to the AppSdk constructor&lt;br /&gt;
mAppSdk = new AppSdk(appContext, appSdkConfig, appSdkListener);&lt;br /&gt;
}&lt;br /&gt;
catch (JSONException e)&lt;br /&gt;
{&lt;br /&gt;
  Log.e(TAG, &amp;quot;Couldn’t prepare JSONObject for appSdkConfig&amp;quot;, e);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note''': before going live you have to inform Nielsen team - this is necessary, because Nielsen team has to adjust internal configuration parameter to enable data collection. Without that notification no data will be collected and no data will be reported.&lt;/div&gt;</summary>
		<author><name>YaminiKumawat</name></author>
	</entry>
</feed>