<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://engineeringportal.nielsen.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mywikis</id>
	<title>Engineering Client Portal - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://engineeringportal.nielsen.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mywikis"/>
	<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/wiki/Special:Contributions/Mywikis"/>
	<updated>2026-04-17T01:18:13Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=MediaWiki:Common.css&amp;diff=7119</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=MediaWiki:Common.css&amp;diff=7119"/>
		<updated>2024-11-18T16:33:36Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Deprecation warning resolved&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
	font-family: 'Inter';&lt;br /&gt;
	src: url(https://eng-client-portal-npd.nonprod.digitalengsdk.com/w/skins/foreground/assets/fonts/Inter-VariableFont_slnt,wght.ttf) format(&amp;quot;opentype&amp;quot;),&lt;br /&gt;
		url(https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&amp;amp;display=swap);&lt;br /&gt;
	font-feature-settings: &amp;quot;zero&amp;quot;; &lt;br /&gt;
	font-variant-numeric: slashed-zero;&lt;br /&gt;
	font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
	font-family: 'Fira Code';&lt;br /&gt;
	src:  url(https://eng-client-portal-npd.nonprod.digitalengsdk.com/w/skins/foreground/assets/fonts/FiraCode-VariableFont_wght.ttf) format(&amp;quot;opentype&amp;quot;),&lt;br /&gt;
		url(https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600&amp;amp;display=swap);&lt;br /&gt;
    font-variant-numeric: slashed-zero;&lt;br /&gt;
	font-feature-settings: &amp;quot;zero&amp;quot;;&lt;br /&gt;
	font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
html {&lt;br /&gt;
  background: #FFFFFF;&lt;br /&gt;
  font-family: 'Inter', sans-serif;&lt;br /&gt;
  -webkit-text-size-adjust: 100%;&lt;br /&gt;
  -ms-text-size-adjust: 100%;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  tab-size: 4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
  height: auto !important;&lt;br /&gt;
  font-family: 'Inter', sans-serif !important;&lt;br /&gt;
  color: #111218;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fix so &amp;lt;tt&amp;gt;, &amp;lt;code&amp;gt;, and &amp;lt;pre&amp;gt; display in a suitable size in firefox, chrome, etc */&lt;br /&gt;
tt, code, pre  { &lt;br /&gt;
	font-size: 0.85rem;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
code {&lt;br /&gt;
  	/*display: block;*/&lt;br /&gt;
	margin: 2px 4px;&lt;br /&gt;
	white-space: normal;&lt;br /&gt;
	overflow-wrap: anywhere;&lt;br /&gt;
	/*padding: 8px 12px;*/&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
blockquote {&lt;br /&gt;
	margin: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
em, i {&lt;br /&gt;
	font-family: 'Inter', sans-serif;&lt;br /&gt;
	font-style: oblique 14deg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p+p {&lt;br /&gt;
  margin-top: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.center {&lt;br /&gt;
  text-align: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.row {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: row;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.row { &lt;br /&gt;
	width: 100%; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media only screen and (max-width: 40.0625em) /* small screens (up to 641px) */ { &lt;br /&gt;
	div.row .row {	&lt;br /&gt;
		flex-wrap: wrap;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	div.large-6.columns {&lt;br /&gt;
		flex-wrap: wrap;&lt;br /&gt;
		width: auto;	&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#breadcrumb { &lt;br /&gt;
		font-size: 1rem !important;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	#bannertext {&lt;br /&gt;
		font-size: 1.2rem !important;&lt;br /&gt;
		margin: 1rem !important;&lt;br /&gt;
		line-height: 1.2065em;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media only screen and (min-width: 40.0625em) and (max-width: 64.0625em) /* large mobile devices &amp;amp; tablets (640px) to laptops (1025px) */ { &lt;br /&gt;
	.row {&lt;br /&gt;
		max-width: 80%; }&lt;br /&gt;
	&lt;br /&gt;
	div.large-6.columns {	&lt;br /&gt;
		max-width: 23%;&lt;br /&gt;
		margin: 5px !important;&lt;br /&gt;
	}&lt;br /&gt;
    &lt;br /&gt;
	.large-6.columns .iconText, .large-6.columns .iconText a {&lt;br /&gt;
		font-size: 0.85em !important;&lt;br /&gt;
		height: 30px !important;&lt;br /&gt;
		line-height: 0.875rem;	} &lt;br /&gt;
&lt;br /&gt;
	.iconImage { &lt;br /&gt;
		padding: 1em !important; }&lt;br /&gt;
	&lt;br /&gt;
	#breadcrumb {    &lt;br /&gt;
		font-size: 1rem !important;	}&lt;br /&gt;
		&lt;br /&gt;
	#bannertext {&lt;br /&gt;
		font-size: 1.3rem !important;&lt;br /&gt;
		margin: 1rem 2rem 1rem 2rem !important;	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media only screen and (min-width: 64.0625em) and (max-width: 90.0625em) /* laptop (1024px) to large monitor (1441px) */ { &lt;br /&gt;
	.row {&lt;br /&gt;
		max-width: 70%; }&lt;br /&gt;
&lt;br /&gt;
	div.large-6.columns { &lt;br /&gt;
		font-size: smaller;	}&lt;br /&gt;
		&lt;br /&gt;
	#bannertext {&lt;br /&gt;
    	font-size: 1.3rem !important;&lt;br /&gt;
    	margin: 1rem 3rem 1rem 3rem !important;	}&lt;br /&gt;
		&lt;br /&gt;
	#breadcrumb {    &lt;br /&gt;
		font-size: 1rem !important;    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media only screen and (min-width: 64.0625em) /* screens wider than 1440px */ { &lt;br /&gt;
	div.large-6.columns {&lt;br /&gt;
    	width: 23%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media only screen and (min-width: 90.0625em) and (max-width: 160.0625em) /* large monitor (1441px) to 4K screen (2561px) */ { &lt;br /&gt;
	.row {&lt;br /&gt;
		max-width: 65%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media only screen and (min-width: 160.0625em) /* screens wider than 2560px */ { &lt;br /&gt;
	.row {&lt;br /&gt;
		max-width: 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main landing page */&lt;br /&gt;
&lt;br /&gt;
div.small-4.large-4.columns {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    background: #F1F2F3;&lt;br /&gt;
	border-radius: 12px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    padding: 32px;&lt;br /&gt;
    margin: 10px;&lt;br /&gt;
    width: auto;&lt;br /&gt;
    height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.small-4.large-4.columns .iconText, .small-4.large-4.columns .iconText a {&lt;br /&gt;
	width: 150px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* separate LOB landing pages */&lt;br /&gt;
&lt;br /&gt;
div.large-6.columns {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    align-items: stretch;&lt;br /&gt;
    align-content: center;&lt;br /&gt;
    background: #F1F2F3;&lt;br /&gt;
    border-radius: 12px;&lt;br /&gt;
    padding: 10px 20px 30px 20px;&lt;br /&gt;
    margin: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.iconImage {&lt;br /&gt;
  margin: auto;&lt;br /&gt;
  padding: 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.iconText, .iconText a {&lt;br /&gt;
	font-size: 1rem;&lt;br /&gt;
	font-family: 'Inter', sans-serif !important;&lt;br /&gt;
	font-weight: 600;&lt;br /&gt;
	text-transform: capitalize;&lt;br /&gt;
	background: #6A46FE;&lt;br /&gt;
	border: 2px solid #6A46FE;&lt;br /&gt;
	border-radius: 32px;&lt;br /&gt;
	color: #ffffff;&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: row;&lt;br /&gt;
	justify-content: center;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
	padding: 0.3em;&lt;br /&gt;
	gap: 4px;&lt;br /&gt;
	width: auto;&lt;br /&gt;
	height: 48px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* TABLE OF CONTENTS */&lt;br /&gt;
&lt;br /&gt;
#toc.toc {&lt;br /&gt;
	position: fixed;&lt;br /&gt;
	height: auto;&lt;br /&gt;
	width: auto;&lt;br /&gt;
	max-width: 280px;&lt;br /&gt;
	max-height: 100dvh;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	left: 0;&lt;br /&gt;
	top: 55px;&lt;br /&gt;
	z-index: 1000;&lt;br /&gt;
	background-color: rgba(249, 249, 249, 0.95);&lt;br /&gt;
	border: none;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc &amp;gt; ul {&lt;br /&gt;
    height: 90dvh;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
    scrollbar-gutter: stable;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toc .toctitle {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: row-reverse;&lt;br /&gt;
	justify-content: flex-end;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
	height: 35px;&lt;br /&gt;
	width: auto;&lt;br /&gt;
	flex-wrap: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctogglespan .toctogglelabel {&lt;br /&gt;
	margin: 6px;&lt;br /&gt;
	float: left;&lt;br /&gt;
	display: block;&lt;br /&gt;
	height: auto;&lt;br /&gt;
	width: auto;&lt;br /&gt;
	content: url(https://mywikis-wiki-media.s3.us-central-1.wasabisys.com/nielsen/hamburgersmall.png);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toc .toctitle h2 {&lt;br /&gt;
	visibility: hidden;&lt;br /&gt;
	width: 0;&lt;br /&gt;
	height: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc ul, .toc ul {&lt;br /&gt;
	font-size: 0.75rem;&lt;br /&gt;
	line-height: 1rem;&lt;br /&gt;
	margin-right: 0;&lt;br /&gt;
	margin-left: 2px;&lt;br /&gt;
	padding-block: 6px;&lt;br /&gt;
	padding-inline-start: 10px;&lt;br /&gt;
	padding-inline-end: 2px;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
#toc li, .toc li &amp;gt; a {&lt;br /&gt;
	font-size: 0.75rem;&lt;br /&gt;
	line-height: 0.9rem;&lt;br /&gt;
	padding-block:3px;&lt;br /&gt;
	color: #111218;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toc li:hover &amp;gt; a:hover { &lt;br /&gt;
	color: #6A46FE;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
.tocnumber {	&lt;br /&gt;
	display: none; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#toctogglecheckbox {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctogglecheckbox, &lt;br /&gt;
:not(:checked) &amp;gt; .toctogglecheckbox {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
	margin: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* &lt;br /&gt;
:default(.toctogglecheckbox:checked) ~ ul {&lt;br /&gt;
	visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:where(.toctogglecheckbox:checked) ~ ul {&lt;br /&gt;
	visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
.toctogglecheckbox:not(:checked) + .toctitle .toctogglelabel:after {&lt;br /&gt;
    content: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctogglecheckbox:checked + .toctitle .toctogglelabel:after {&lt;br /&gt;
	content: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:not(:checked) &amp;gt; .toctogglespan:before { &lt;br /&gt;
	content: none !important; }&lt;br /&gt;
	&lt;br /&gt;
:not(:checked) &amp;gt; .toctogglespan:after { &lt;br /&gt;
	content: none !important; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* TABLE FORMATTING */&lt;br /&gt;
&lt;br /&gt;
.smallIcon {&lt;br /&gt;
  margin-right: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table tr th {&lt;br /&gt;
  padding: 0.5625em 0.5625em;&lt;br /&gt;
  font-size: 0.875em !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table tr td {&lt;br /&gt;
  padding: 0.5625em 0.5625em;&lt;br /&gt;
  font-size: 0.875em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Use the name altertable as the class when you want to alternate row colors - La Mar */&lt;br /&gt;
table.altertable tr:nth-child(even) {&lt;br /&gt;
  background-color: #d0f6f8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* LIST FORMATTING */&lt;br /&gt;
&lt;br /&gt;
.mw-content-ltr ul {&lt;br /&gt;
	margin: 0.25em 0.5em 0.25em 2em;&lt;br /&gt;
	font-size: inherit; /* so that lists within a table are the correct font size */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* TOP BAR FORMATTING */&lt;br /&gt;
&lt;br /&gt;
#navwrapper {&lt;br /&gt;
  top: 0;&lt;br /&gt;
  background: rgb(0,33,66,0.9) !important;&lt;br /&gt;
  /* background-color: #002142; */&lt;br /&gt;
  margin-top: 0;&lt;br /&gt;
  margin-bottom: -6px;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: row;&lt;br /&gt;
  align-content: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  flex-wrap: nowrap;&lt;br /&gt;
  position: sticky;&lt;br /&gt;
  z-index: 900;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
nav.top-bar, .top-bar {&lt;br /&gt;
  background: transparent;&lt;br /&gt;
  height: 55px;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: row;&lt;br /&gt;
  justify-content: space-around;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
div.title-name {&lt;br /&gt;
	font-family: 'Inter', sans-serif !important;&lt;br /&gt;
	font-weight: 500;&lt;br /&gt;
	text-transform: capitalize !important;&lt;br /&gt;
	color: #ffffff !important;&lt;br /&gt;
	font-size: 1.0875rem !important;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	position: relative;&lt;br /&gt;
	z-index: 901;&lt;br /&gt;
	margin: 0 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media only screen and (min-width: 40em) /* top bar adjustments for screens 640px and up */ {&lt;br /&gt;
	.top-bar:before, .top-bar:after {&lt;br /&gt;
		content: none; &lt;br /&gt;
    	display: table; &lt;br /&gt;
    	margin-inline-start: auto;&lt;br /&gt;
    	margin-inline-end: auto;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.top-bar .title-area {&lt;br /&gt;
		width: 18rem !important;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.top-bar-section .dropdown {&lt;br /&gt;
		top: 45px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.top-bar-section .has-dropdown.moved &amp;gt; .dropdown a, .top-bar-section .has-dropdown.moved &amp;gt; .dropdown {&lt;br /&gt;
		top: 45px;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media only screen and (max-width: 40em) /* top bar, top bar expanded, search form, and personal tools dropdown adjustments for screens up to 640px */ {&lt;br /&gt;
	.top-bar .title-area {&lt;br /&gt;
		width: inherit;	}&lt;br /&gt;
	&lt;br /&gt;
	.top-bar-section {&lt;br /&gt;
		right: 0 !important;&lt;br /&gt;
		width: inherit;&lt;br /&gt;
		position: static;&lt;br /&gt;
		transition: none;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.top-bar.expanded {&lt;br /&gt;
		overflow: visible;	}&lt;br /&gt;
		&lt;br /&gt;
	.top-bar.expanded .top-bar-section .has-dropdown:not(.moved) &amp;gt; ul {&lt;br /&gt;
		height: 0;&lt;br /&gt;
		width: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		position: absolute !important;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	.top-bar-section .dropdown li a.parent-link,&lt;br /&gt;
	.top-bar-section .has-dropdown li a.parent-link {&lt;br /&gt;
		height: 0px;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
		width: 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.top-bar.expanded .top-bar-section .dropdown,&lt;br /&gt;
	.top-bar.expanded .top-bar-section .has-dropdown.moved &amp;gt; .dropdown,  &lt;br /&gt;
	.top-bar.expanded .top-bar-section .has-dropdown.moved &amp;gt; .dropdown a {&lt;br /&gt;
		color: #ffffff;&lt;br /&gt;
		width: 18em;&lt;br /&gt;
		font-family: 'Inter',sans-serif;&lt;br /&gt;
		line-height: 1.5rem;&lt;br /&gt;
		background: inherit;&lt;br /&gt;
		margin: auto;&lt;br /&gt;
		float: right;&lt;br /&gt;
		clear: both;&lt;br /&gt;
		position: static !important;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.top-bar-section ul li.active &amp;gt; a a:not(.button), .top-bar-section ul li ul.dropdown li &amp;gt; a {&lt;br /&gt;
		background: rgb(0, 33, 66, 0.9) !important;	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	#personal-tools-dropdown li.title.back.js-generated {&lt;br /&gt;
		background: url(https://eng-client-portal-npd.nonprod.digitalengsdk.com/w/images/4/43/action-icondark_mode_.png) no-repeat !important;&lt;br /&gt;
		background-size: contain !important;&lt;br /&gt;
		background-position: center;&lt;br /&gt;
		width: fit-content;&lt;br /&gt;
		float: right;&lt;br /&gt;
		z-index: 1000;&lt;br /&gt;
		position: relative;&lt;br /&gt;
		top: -20px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	.top-bar-section .dropdown li.title h5 a {&lt;br /&gt;
		display: inline-block;&lt;br /&gt;
		font-size: 0.75rem;&lt;br /&gt;
		color: transparent;&lt;br /&gt;
		background: transparent;&lt;br /&gt;
		width: fit-content !important;&lt;br /&gt;
		float: right;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
		z-index: 999;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.top-bar.expanded .top-bar-section .dropdown li.title h5, &lt;br /&gt;
	.top-bar.expanded .top-bar-section .dropdown li.title h5 a {&lt;br /&gt;
		background: transparent !important;&lt;br /&gt;
		color: transparent !important;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	ul#actions.f-dropdown.open {&lt;br /&gt;
		max-width: fit-content !important;&lt;br /&gt;
		right: 50px !important;&lt;br /&gt;
		left: auto !important;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#toc {&lt;br /&gt;
		visibility: hidden;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar .title-area {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: row;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
	flex-wrap: nowrap;&lt;br /&gt;
	position: relative;&lt;br /&gt;
	height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
nav.top-bar.expanded {&lt;br /&gt;
	height: auto !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar.expanded .title-area {&lt;br /&gt;
  background: inherit;&lt;br /&gt;
  width: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar .name, .top-bar .name a {&lt;br /&gt;
  color: #ffffff !important;&lt;br /&gt;
  width: inherit;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  font-size: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
img.top-bar-logo {&lt;br /&gt;
	height: auto;&lt;br /&gt;
	max-height: 20px;&lt;br /&gt;
	max-width: 100%;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	padding: 0 0 0 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar .toggle-topbar.menu-icon {&lt;br /&gt;
	margin: 0 0.5rem;&lt;br /&gt;
	top: auto;&lt;br /&gt;
	right: auto;&lt;br /&gt;
	position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar .toggle-topbar.menu-icon a {&lt;br /&gt;
  color: transparent;&lt;br /&gt;
  padding: 0 0.5rem;&lt;br /&gt;
  line-height: normal;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 55px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.small-12.columns /* top bar search form section */ { &lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: row;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
	flex-wrap: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#top-bar-right.right, #top-bar-right.right .has-form li {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: row;&lt;br /&gt;
    flex-wrap: nowrap;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    max-width: none;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    max-height: 40px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
li#personal-tools-dropdown {&lt;br /&gt;
  visibility: visible !important;&lt;br /&gt;
  width: inherit;&lt;br /&gt;
  max-width: 50px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
li#personal-tools-dropdown .drop-icon {&lt;br /&gt;
	margin-right: 15px;&lt;br /&gt;
	font-size: 14px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-cactions #actions {&lt;br /&gt;
	z-index: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a#actions-button {&lt;br /&gt;
	z-index: 599;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section .has-dropdown {&lt;br /&gt;
  visibility: hidden;&lt;br /&gt;
  width: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section .dropdown {&lt;br /&gt;
	z-index: 601;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section ul {&lt;br /&gt;
  background: inherit;&lt;br /&gt;
  width: inherit;&lt;br /&gt;
  margin: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section ul li {&lt;br /&gt;
  background: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section .has-form, .top-bar-section li a:not(.button) {&lt;br /&gt;
	 background: inherit;&lt;br /&gt;
	 font-family: 'Inter', sans-serif;&lt;br /&gt;
	 max-height: inherit;&lt;br /&gt;
	 height: auto;&lt;br /&gt;
	 width: inherit;&lt;br /&gt;
	padding: 0.25rem 0.5rem 0.25rem 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section ul li:hover:not(.has-form) &amp;gt; a, .top-bar-section li.active:not(.has-form) a:not(.button){&lt;br /&gt;
    background: inherit;&lt;br /&gt;
    color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section ul li.active &amp;gt; a a:not(.button), .top-bar-section ul li ul.dropdown li &amp;gt; a {&lt;br /&gt;
  background: rgb(0, 33, 66, 0.9) !important;&lt;br /&gt;
  border-bottom: 0px solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section ul li.hover&amp;gt;a, .top-bar-section ul li ul.dropdown li.hover&amp;gt;a {&lt;br /&gt;
  background: inherit;&lt;br /&gt;
  color: transparent;&lt;br /&gt;
  border-bottom: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section&amp;gt;ul&amp;gt;.divider, .top-bar-section&amp;gt;ul&amp;gt;[role=&amp;quot;separator&amp;quot;] {&lt;br /&gt;
  border-color: -moz-use-text-color #fff;&lt;br /&gt;
  border-right: solid 0px #fff;&lt;br /&gt;
  border-left: solid 0px #fff;&lt;br /&gt;
  max-width: 5%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section .divider, .top-bar-section [role=&amp;quot;separator&amp;quot;] {&lt;br /&gt;
  border-bottom: solid 0px;&lt;br /&gt;
  border-top: solid 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* SEARCH - TOP BAR */&lt;br /&gt;
&lt;br /&gt;
.top-bar .button.search {&lt;br /&gt;
  margin: 4px;&lt;br /&gt;
  background: url(https://mywikis-wiki-media.s3.us-central-1.wasabisys.com/nielsen/searchwhite.png) no-repeat; &lt;br /&gt;
  color: transparent;&lt;br /&gt;
  width: 21px;&lt;br /&gt;
  border: none;&lt;br /&gt;
  background-size: contain;&lt;br /&gt;
  background-position: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
input#searchInput {&lt;br /&gt;
	background: #F1F2F3;&lt;br /&gt;
	border-radius: 8px !important;&lt;br /&gt;
	border-width: 2px !important;&lt;br /&gt;
	border-color: #DDDEE4 !important;&lt;br /&gt;
	font-size: 0.75rem;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	height: 25px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
input#searchInput::placeholder {&lt;br /&gt;
	visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oo-ui-iconElement-icon { opacity: 50%; }&lt;br /&gt;
&lt;br /&gt;
#searchInput::-webkit-input-placeholder { color: #FFFFFF; }&lt;br /&gt;
&lt;br /&gt;
#searchInput:-moz-placeholder { color: #FFFFFF; }&lt;br /&gt;
&lt;br /&gt;
#searchInput::-moz-placeholder { color: #FFFFFF; }&lt;br /&gt;
&lt;br /&gt;
#searchInput:-ms-input-placeholder { color: #FFFFFF; }&lt;br /&gt;
&lt;br /&gt;
/* Create page in Search */&lt;br /&gt;
.mw-search-createlink { display: none; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* SEARCH - PAGE */&lt;br /&gt;
&lt;br /&gt;
div.oo-ui-fieldLayout-field {&lt;br /&gt;
	display: flex !important;&lt;br /&gt;
	flex-direction: row;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
	margin: 18px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oo-ui-actionFieldLayout-input, .oo-ui-actionFieldLayout-button {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	margin: 10px;&lt;br /&gt;
	max-height: 38px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oo-ui-actionFieldLayout .oo-ui-actionFieldLayout-input .oo-ui-widget.oo-ui-textInputWidget &amp;gt; .oo-ui-inputWidget-input {&lt;br /&gt;
	background: #F1F2F3;&lt;br /&gt;
	border: 2px solid #DDDEE4;&lt;br /&gt;
	border-radius: 8px;&lt;br /&gt;
	margin-right: 10px;&lt;br /&gt;
	position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oo-ui-actionFieldLayout-input {&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oo-ui-actionFieldLayout-button {&lt;br /&gt;
 	width: 20%;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
.oo-ui-textInputWidget {&lt;br /&gt;
	max-width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-widget-searchInputWidget {&lt;br /&gt;
	display: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-search-top-table div.oo-ui-actionFieldLayout {&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	max-width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* BUTTONS */&lt;br /&gt;
&lt;br /&gt;
button,&lt;br /&gt;
.button,&lt;br /&gt;
.multipleTemplateAdder {&lt;br /&gt;
  background-color: #6A46FE;&lt;br /&gt;
  border: 2px solid #6A46FE;&lt;br /&gt;
  border-radius: 32px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
button:hover,&lt;br /&gt;
button:focus,&lt;br /&gt;
.button:hover,&lt;br /&gt;
.button:focus {&lt;br /&gt;
  background-color: #4B31AF;&lt;br /&gt;
  border: 2px solid #4B31AF;&lt;br /&gt;
  border-radius: 32px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
button:disabled,&lt;br /&gt;
.button:disabled {&lt;br /&gt;
	background-color: #6A46FE;&lt;br /&gt;
	border: 2px solid #6A46FE;&lt;br /&gt;
	border-radius: 32px;&lt;br /&gt;
	opacity: 0.32;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive &amp;gt; .oo-ui-buttonElement-button,&lt;br /&gt;
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive &amp;gt; .oo-ui-buttonElement-button:active { &lt;br /&gt;
	border: 2px solid #6A46FE;&lt;br /&gt;
	border-radius: 32px;&lt;br /&gt;
	background-color: #6A46FE;&lt;br /&gt;
	color: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive &amp;gt; .oo-ui-buttonElement-button:hover { &lt;br /&gt;
	 background-color: #4B31AF;&lt;br /&gt;
	border: 2px solid #4B31AF;&lt;br /&gt;
	border-radius: 32px;&lt;br /&gt;
	color: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive &amp;gt; .oo-ui-buttonElement-button:focus { &lt;br /&gt;
	background-color: #4B31AF;&lt;br /&gt;
	border: 2px solid #4B31AF;&lt;br /&gt;
	border-radius: 32px;&lt;br /&gt;
	box-shadow: 0px 0px 0px 6px rgba(149, 140, 248, 0.16);&lt;br /&gt;
	color: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
input#wpPreview {&lt;br /&gt;
	border: 2px solid #6A46FE;&lt;br /&gt;
	border-radius: 32px;&lt;br /&gt;
	background-color: #6A46FE;&lt;br /&gt;
	color: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
input#wpDiff {&lt;br /&gt;
	border: 2px solid #DDDEE4;&lt;br /&gt;
	border-radius: 32px;&lt;br /&gt;
	background-color: #F1F2F3;&lt;br /&gt;
	color: #111218;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
button.secondary,&lt;br /&gt;
button.secondary:hover,&lt;br /&gt;
button.secondary:focus,&lt;br /&gt;
.button.secondary,&lt;br /&gt;
.button.secondary:hover,&lt;br /&gt;
.button.secondary:focus {&lt;br /&gt;
	background: #363945;&lt;br /&gt;
	border: 2px solid #363945;&lt;br /&gt;
	border-radius: 32px;&lt;br /&gt;
	color: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Back to Top button - use TopButton template */&lt;br /&gt;
&lt;br /&gt;
span#Topbutton, #Topbutton a {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	background-color: #6a46fec4;&lt;br /&gt;
	width: auto;&lt;br /&gt;
	height: auto;&lt;br /&gt;
	max-width: 50px;&lt;br /&gt;
	max-height: 50px;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	/* padding: 10px; */&lt;br /&gt;
	border-radius: 8px;&lt;br /&gt;
	position: fixed;&lt;br /&gt;
	bottom: 40px;&lt;br /&gt;
	right: 30px;&lt;br /&gt;
	/* transition: background-color .3s,opacity .5s,visibility .5s; */&lt;br /&gt;
	opacity: 1;&lt;br /&gt;
	visibility: visible;&lt;br /&gt;
	z-index: 1000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#Topbutton a {&lt;br /&gt;
	content: url(https://eng-client-portal-npd.nonprod.digitalengsdk.com/w/images/6/67/caretwhite.png);&lt;br /&gt;
	padding: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#Topbutton a:hover {&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
	background-color: #4B31AF&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#Topbutton:active {&lt;br /&gt;
	background-color: #6A46FEc4&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* LINK FORMATTING */&lt;br /&gt;
&lt;br /&gt;
a {&lt;br /&gt;
  color: #6A46FE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a:hover,&lt;br /&gt;
a:focus {&lt;br /&gt;
  color: #4B31AF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* a.new { color: #ba0000; } */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.label {&lt;br /&gt;
  background-color: transparent;&lt;br /&gt;
  font-size: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* &amp;quot;Special&amp;quot; label */&lt;br /&gt;
h4.namespace.label {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bannertext a {&lt;br /&gt;
	color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* TEXT FORMATTING */&lt;br /&gt;
&lt;br /&gt;
.mw-headline {&lt;br /&gt;
  font-family: 'Inter', sans-serif !important;&lt;br /&gt;
  color: #111218; /* removed !important ... need to check how it behaves */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1 {&lt;br /&gt;
	font-family: 'Inter', sans-serif;&lt;br /&gt;
	font-weight: 800;&lt;br /&gt;
	font-size: 2rem;&lt;br /&gt;
	letter-spacing: -0.25px;&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
	margin-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2 {&lt;br /&gt;
  font-family: 'Inter', sans-serif !important;&lt;br /&gt;
  color: #111218;&lt;br /&gt;
  font-weight: 800;&lt;br /&gt;
  font-size: 1.8rem;&lt;br /&gt;
  letter-spacing: -0.25px;&lt;br /&gt;
  margin-top: 1.5em;&lt;br /&gt;
  margin-bottom: 0.83em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h3 {&lt;br /&gt;
	font-family: 'Inter', sans-serif;&lt;br /&gt;
	font-size: 1.65rem;&lt;br /&gt;
	font-weight: 800;&lt;br /&gt;
	color: #002142 !important;&lt;br /&gt;
	letter-spacing: -0.33px;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
	margin-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h4 {&lt;br /&gt;
	font-family: 'Inter', sans-serif;&lt;br /&gt;
	font-size: 1.33rem;&lt;br /&gt;
	font-weight: 600;&lt;br /&gt;
	letter-spacing: -0.25px;&lt;br /&gt;
	margin-top: 1.75em;&lt;br /&gt;
	margin-bottom: 0.4em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h5 {&lt;br /&gt;
	font-family: 'Inter', sans-serif;&lt;br /&gt;
	font-size: 1.33rem;&lt;br /&gt;
	font-weight: 500;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
	margin-top: 1.75em;&lt;br /&gt;
	margin-bottom: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h6 {&lt;br /&gt;
	font-family: 'Inter', sans-serif;&lt;br /&gt;
	font-size: 1.15rem;&lt;br /&gt;
	font-weight: 600;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
	margin-bottom: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1#firstHeading {&lt;br /&gt;
	visibility: hidden;&lt;br /&gt;
	height: 0px;&lt;br /&gt;
	margin: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* what is this for? */&lt;br /&gt;
h2#firstHeading.title {&lt;br /&gt;
  font-family: 'Inter', sans-serif;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-size: 1rem;&lt;br /&gt;
  letter-spacing: -0.25px;&lt;br /&gt;
  text-transform: capitalize;&lt;br /&gt;
  margin-bottom: 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2#filehistory {&lt;br /&gt;
  visibility: hidden;&lt;br /&gt;
  height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2#metadata {&lt;br /&gt;
  visibility: hidden;&lt;br /&gt;
  height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h3#tagline {&lt;br /&gt;
  visibility: hidden;&lt;br /&gt;
  height: 0px;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h5#siteSub {&lt;br /&gt;
	visibility: hidden;&lt;br /&gt;
	height: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Category links */&lt;br /&gt;
&lt;br /&gt;
div #catlinks.catlinks {&lt;br /&gt;
  margin-top: 2.5em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#catlinks {&lt;br /&gt;
  visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ul#filetoc {&lt;br /&gt;
  visibility: hidden;&lt;br /&gt;
  height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#mw-imagepage-section-filehistory {&lt;br /&gt;
  visibility: hidden;&lt;br /&gt;
  height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
span.mw-redirectedfrom {&lt;br /&gt;
  visibility: hidden;&lt;br /&gt;
  height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.mw-imagepage-section-metadata {&lt;br /&gt;
  visibility: hidden;&lt;br /&gt;
  height: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-ui-vform {&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  margin-right: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer-left, ul#footer-left {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  font-size: 80%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
li#footer-about {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer-lastmod {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
footer.row {&lt;br /&gt;
  margin-top: 2.5em;&lt;br /&gt;
  margin-bottom: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
div#mw-customtoggle-myDivision.mw-customtoggle-myDivision {&lt;br /&gt;
	display: flex !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-collapsible-toggle.mw-collapsible-toggle-default.mw-collapsible-toggle-expanded {&lt;br /&gt;
	background: url(https://eng-client-portal-npd.nonprod.digitalengsdk.com/w/images/9/9c/collapse.png) no-repeat;&lt;br /&gt;
	background-size: contain;&lt;br /&gt;
	width: 35px;&lt;br /&gt;
	height: 35px;&lt;br /&gt;
	float: none !important;&lt;br /&gt;
	display: inline-flex;&lt;br /&gt;
	float: none !important;&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  .mw-collapsible-toggle.mw-collapsible-toggle-collapsed {&lt;br /&gt;
	display: inline-flex;&lt;br /&gt;
	margin: 4px;&lt;br /&gt;
	background: url(https://eng-client-portal-npd.nonprod.digitalengsdk.com/w/images/3/32/expand.png) no-repeat;&lt;br /&gt;
	background-size: contain;&lt;br /&gt;
	width: 35px;&lt;br /&gt;
	height: 35px;&lt;br /&gt;
	float: none !important;&lt;br /&gt;
	flex-wrap: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a.mw-collapsible-text {&lt;br /&gt;
	color: transparent;&lt;br /&gt;
	width: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
span.mw-collapsible-toggle-default:before {&lt;br /&gt;
	content: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
span.mw-collapsible-toggle-default:after {&lt;br /&gt;
	content: none !important;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Template:TVDownloadRequestLink&amp;diff=6629</id>
		<title>Template:TVDownloadRequestLink</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Template:TVDownloadRequestLink&amp;diff=6629"/>
		<updated>2024-04-22T19:38:42Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[https://engineeringportal.nielsen.com/wiki/Special:TVClickThrough?dlid={{{dlid}}} {{{name}}}]&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=MediaWiki:Common.css&amp;diff=6628</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=MediaWiki:Common.css&amp;diff=6628"/>
		<updated>2024-04-11T21:17:07Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
html {&lt;br /&gt;
    background: #FFFFFF;&lt;br /&gt;
    background-image: url('/w/resources/assets/Waves_1_Blue_RGB_bar.png');&lt;br /&gt;
    background-repeat: repeat-x;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
	height: auto !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: 'knockout-knockout-28';&lt;br /&gt;
  src: url(&amp;quot;/w/resources/assets/fonts/knockout28.woff&amp;quot;) format('woff2');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-logo {&lt;br /&gt;
    max-width: 64px;&lt;br /&gt;
    height: auto;&lt;br /&gt;
    max-height: 36px;&lt;br /&gt;
    margin-left: 15px;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.title-name {&lt;br /&gt;
	font-family: knockout-knockout-28, Arial, sans-serif;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    color: #354052 !important;&lt;br /&gt;
    font-size: 1.35em !important;&lt;br /&gt;
    line-height: 1.6em !important;&lt;br /&gt;
    margin-left: 0px;&lt;br /&gt;
    white-space: -moz-nowrap;&lt;br /&gt;
    white-space: -o-nowrap;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
    word-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#navwrapper img {&lt;br /&gt;
    vertical-align: top !important;&lt;br /&gt;
    padding-right: 10px;&lt;br /&gt;
    padding-left: 1px;&lt;br /&gt;
    padding-top: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#navwrapper {&lt;br /&gt;
    margin-top:6px;&lt;br /&gt;
    margin-bottom: -6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section ul li {&lt;br /&gt;
    background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#catlinks{&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.center{&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-ui-vform{&lt;br /&gt;
    margin-left: auto;&lt;br /&gt;
    margin-right: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#searchInput::-webkit-input-placeholder&lt;br /&gt;
{&lt;br /&gt;
  color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#searchInput:-moz-placeholder &lt;br /&gt;
{&lt;br /&gt;
  color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#searchInput::-moz-placeholder &lt;br /&gt;
{&lt;br /&gt;
  color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#searchInput:-ms-input-placeholder &lt;br /&gt;
{&lt;br /&gt;
  color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.smallIcon {&lt;br /&gt;
margin-right: 1.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.iconImage {&lt;br /&gt;
margin:auto;&lt;br /&gt;
padding: 1.7ex;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.iconText {&lt;br /&gt;
position: relative;&lt;br /&gt;
font-size: 2.5em;&lt;br /&gt;
line-height: 1.2em;&lt;br /&gt;
font-family: knockout-knockout-28;&lt;br /&gt;
text-transform:uppercase;&lt;br /&gt;
z-index: +1000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media only screen and (max-width: 768px) {&lt;br /&gt;
.iconText {&lt;br /&gt;
font-size: 1.5em !important;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#bannerDataTexture {&lt;br /&gt;
background-image: url('/w/resources/assets/Waves_1_Blue_RGB_bar.png'); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#alertDataTexture {&lt;br /&gt;
background-image: url('/w/resources/assets/Waves_1_Red_RGB_bar.png'); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#navwrapper img {&lt;br /&gt;
vertical-align: top !important;&lt;br /&gt;
padding-right: 10px;&lt;br /&gt;
padding-left: 1px;&lt;br /&gt;
padding-top: 10px;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
p + p{&lt;br /&gt;
  margin-top:10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#firstHeading {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer-lastmod { display: none; }&lt;br /&gt;
h4.namespace.label { display: none !important;  }  /* &amp;quot;Special&amp;quot; label */&lt;br /&gt;
.mw-search-createlink { display: none; }  /* Create page in Search */&lt;br /&gt;
&lt;br /&gt;
div #toc.toc {&lt;br /&gt;
    font-size: 75%;&lt;br /&gt;
    margin-top: 1em;&lt;br /&gt;
    border: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc ul, .toc ul {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table tr th, table tr td {&lt;br /&gt;
    padding: 0.5625em 0.625em;&lt;br /&gt;
    font-size: 0.875em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* &lt;br /&gt;
.oo-ui-buttonElement-button&lt;br /&gt;
{&lt;br /&gt;
    background-color: #0098F3 !important;&lt;br /&gt;
    border-color: #0098F3 !important;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
.mw-headline {&lt;br /&gt;
    color: #009dd8 !important;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-family: knockout-knockout-28 !important;&lt;br /&gt;
    margin-top: 0.6em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2{&lt;br /&gt;
    margin-bottom: 0em !important;&lt;br /&gt;
    margin-top: .5em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h3{&lt;br /&gt;
    margin-bottom: 0em !important;&lt;br /&gt;
    margin-top: .5em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h4{&lt;br /&gt;
    margin-bottom: 0em !important;&lt;br /&gt;
    margin-top: .5em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h5{&lt;br /&gt;
    margin-top: 0.8em !important;;&lt;br /&gt;
    margin-bottom: 0em !important;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div #catlinks.catlinks { margin-top: 2.5em !important; }&lt;br /&gt;
&lt;br /&gt;
footer.row {&lt;br /&gt;
    margin-bottom: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul#filetoc{&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
    height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2#firstHeading.title {&lt;br /&gt;
    font-family: knockout-knockout-28;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    margin-bottom: 1em;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2#filehistory {&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
    height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h3#tagline {&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
    height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#mw-imagepage-section-filehistory {&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
    height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
span.mw-redirectedfrom {&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
    height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2#metadata {&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
    height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.mw-imagepage-section-metadata {&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
    height: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fix so &amp;lt;tt&amp;gt;, &amp;lt;code&amp;gt;, and &amp;lt;pre&amp;gt; display in a suitable size in firefox, chrome, etc */&lt;br /&gt;
tt, code, pre {&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Custom Foreground menubar colors */&lt;br /&gt;
&lt;br /&gt;
.top-bar.expanded .title-area {&lt;br /&gt;
    background: inherit !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar .toggle-topbar.menu-icon a {&lt;br /&gt;
    color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar .toggle-topbar.menu-icon a span {&lt;br /&gt;
    box-shadow: 0 10px 0 1px #354052, 0 16px 0 1px #354052, 0 22px 0 1px #354052;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.top-bar {&lt;br /&gt;
    background: #fff none repeat scroll 0 0;&lt;br /&gt;
    box-shadow: 0px 3px 10px #bdbdbd;&lt;br /&gt;
    height: 46px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar .name h1,&lt;br /&gt;
.top-bar .name h1 a {&lt;br /&gt;
    color: #354052 !important;&lt;br /&gt;
    width: inherit !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section li a:not(.button) {&lt;br /&gt;
    background: #fff none repeat scroll 0 0;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section ul {&lt;br /&gt;
    background: transparent none repeat scroll 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section ul li.active &amp;gt; a,&lt;br /&gt;
.top-bar-section ul li ul.dropdown li &amp;gt; a {&lt;br /&gt;
    background: #fff none repeat scroll 0 0;&lt;br /&gt;
    color: #354052;&lt;br /&gt;
    border-bottom: 1px solid #fcfcfc;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.top-bar-section ul li.hover &amp;gt; a,&lt;br /&gt;
.top-bar-section ul li ul.dropdown li.hover &amp;gt; a{&lt;br /&gt;
    background: #FFFFFF;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
    border-bottom: 0px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.top-bar-section &amp;gt; ul &amp;gt; .divider,&lt;br /&gt;
.top-bar-section &amp;gt; ul &amp;gt; [role=&amp;quot;separator&amp;quot;] {&lt;br /&gt;
    border-color: -moz-use-text-color #fff;&lt;br /&gt;
    border-right: solid 0px #fff;&lt;br /&gt;
    border-left: solid 0px #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section .divider, .top-bar-section [role=&amp;quot;separator&amp;quot;] {&lt;br /&gt;
    border-bottom: solid 0px;&lt;br /&gt;
    border-top: solid 0px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.top-bar-section .has-form,&lt;br /&gt;
.top-bar-section li a:not(.button) {&lt;br /&gt;
    background: #fff none repeat scroll 0 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
button,&lt;br /&gt;
.button,&lt;br /&gt;
.multipleTemplateAdder {&lt;br /&gt;
    background-color: #00aeef;&lt;br /&gt;
    border-color: #00aeef;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
button:hover,&lt;br /&gt;
button:focus,&lt;br /&gt;
.button:hover,&lt;br /&gt;
.button:focus {&lt;br /&gt;
    background-color: #548dbf;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar-section .has-dropdown {&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
    width: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
li#personal-tools-dropdown {&lt;br /&gt;
    visibility: visible !important;&lt;br /&gt;
    width: inherit !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toggle-topbar.menu-icon a {&lt;br /&gt;
    color: #354052;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
input#wpPreview {&lt;br /&gt;
    background-color: #1e73be;&lt;br /&gt;
    border-color: #1e73be;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.top-bar input {&lt;br /&gt;
    top: 2px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.top-bar .button.search {&lt;br /&gt;
    margin-left: -4px;&lt;br /&gt;
    background: url(resources/assets/search.png) no-repeat;&lt;br /&gt;
    color: transparent;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    width: 28px;&lt;br /&gt;
    border: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.label {&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
a {&lt;br /&gt;
    color: #2ba6cb;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a:hover, a:focus {&lt;br /&gt;
    color: #2795b6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* &lt;br /&gt;
a.new {&lt;br /&gt;
    color: #ba0000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
ul#footer-left {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
li#footer-about {&lt;br /&gt;
display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background: #ebe7e7;&lt;br /&gt;
    line-height: 1.60em;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_Video_TizenTv&amp;diff=6627</id>
		<title>Digital Measurement Video TizenTv</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_Video_TizenTv&amp;diff=6627"/>
		<updated>2024-04-11T19:27:34Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &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;
__NOTOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The following document will highlight the steps needed to run Browser SDK (BSDK) on Samsung Smart TV using TIzen Studio for app development.&lt;br /&gt;
The tutorial should be used in conjunction with the documentation at [https://docs.tizen.org/application/web/get-started/tv/first-samsung-tv-app/ Create Your First Samsung Smart TV Web Application] to build an app with BSDK integration for content measurement. In this tutorial we will create a native app and highlight the different permissions required to run the BSDK.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Install Tizen Studio ==&lt;br /&gt;
&lt;br /&gt;
Navigate [https://developer.tizen.org/development/tizen-studio/download here] and install Tizen Studio.&lt;br /&gt;
During installation make sure to install the '''TV Extensions package''' from the Package Manager.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Generate Security Profile ==&lt;br /&gt;
&lt;br /&gt;
Navigate [https://docs.tizen.org/application/tizen-studio/common-tools/certificate-registration here] and generate the security profile in order to run applications.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Create Basic Project ==&lt;br /&gt;
&lt;br /&gt;
Follow the [https://docs.tizen.org/application/web/get-started/tv/first-samsung-tv-app/ step-by-step guide] and create the Basic Project template. &lt;br /&gt;
Replace the code in the&amp;lt;syntaxhighlight&amp;gt;index.html&amp;lt;/syntaxhighlight&amp;gt;file with the code snippet below and update the App ID with a Nielsen provided App ID during SDK initialization.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=edge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;DCR Video Tizen Sample&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        // Static Queue Snippet&lt;br /&gt;
        !function (e, n) {&lt;br /&gt;
            function t(e) {&lt;br /&gt;
                return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
            }&lt;br /&gt;
            e[n] = e[n] ||&lt;br /&gt;
            {&lt;br /&gt;
                nlsQ: function (o, r, c) {&lt;br /&gt;
                    var s = e.document,&lt;br /&gt;
                        a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
                    a.async = 1,&lt;br /&gt;
                        a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
                    var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
                    return i.parentNode.insertBefore(a, i),&lt;br /&gt;
                        e[n][r] = e[n][r] || {&lt;br /&gt;
                            g: c || {},&lt;br /&gt;
                            ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
                            trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
                        },&lt;br /&gt;
                        e[n][r]&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Replace (PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) with CLIENT APP ID&lt;br /&gt;
        var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;videoSdkInstance&amp;quot;, {&lt;br /&gt;
            nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        var contentMetadata = {&lt;br /&gt;
            type: 'content',&lt;br /&gt;
            assetid: 'VID-123456',&lt;br /&gt;
            program: 'program name',&lt;br /&gt;
            title: 'episode title with season and episode number',&lt;br /&gt;
            length: 'length in seconds',&lt;br /&gt;
            airdate: '20210321 09:00:00',&lt;br /&gt;
            isfullepisode: 'y',&lt;br /&gt;
            adloadtype: '2'&lt;br /&gt;
        };&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
        body {&lt;br /&gt;
            background-color: white;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;DCR Video Tizen Sample App&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
      &amp;lt;video controls src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
        poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot; width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Sorry, your browser doesn't support embedded videos,&lt;br /&gt;
        but don't worry, you can &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
        and watch it with your favorite video player!&lt;br /&gt;
      &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        var media = document.querySelector('video');&lt;br /&gt;
        var playheadPosition = 0;&lt;br /&gt;
        var metadataLoaded = false;&lt;br /&gt;
&lt;br /&gt;
        // Loadmetadata&lt;br /&gt;
        // Load contentMetadata object&lt;br /&gt;
        media.addEventListener('loadedmetadata', (event) =&amp;gt; {&lt;br /&gt;
            // Call SDK loadmetadata event&lt;br /&gt;
            if (!metadataLoaded) {&lt;br /&gt;
                nSdkInstance.ggPM(&amp;quot;loadmetadata&amp;quot;, contentMetadata);&lt;br /&gt;
                metadataLoaded = true;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        media.addEventListener('play', (event) =&amp;gt; {&lt;br /&gt;
            // Call SDK play event&lt;br /&gt;
            if (!metadataLoaded) {&lt;br /&gt;
                nSdkInstance.ggPM(&amp;quot;loadmetadata&amp;quot;, contentMetadata);&lt;br /&gt;
                metadataLoaded = true;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Player paused&lt;br /&gt;
        media.addEventListener('pause', function (e) {&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;pause&amp;quot;, playheadPosition);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Set playhead position&lt;br /&gt;
        media.addEventListener('timeupdate', function (e) {&lt;br /&gt;
            var currTime = Math.floor(media.currentTime);&lt;br /&gt;
            if (playheadPosition &amp;lt; currTime) {&lt;br /&gt;
                playheadPosition = currTime;&lt;br /&gt;
                nSdkInstance.ggPM(&amp;quot;setplayheadposition&amp;quot;, playheadPosition);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // End&lt;br /&gt;
        media.addEventListener('ended', function (e) {&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;end&amp;quot;, playheadPosition);&lt;br /&gt;
            metadataLoaded = false;&lt;br /&gt;
            playheadPosition = 0;&lt;br /&gt;
        });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Step 4: Run Project==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Right click on the project &amp;gt; Run As &amp;gt; Tizen Web Simulator Application (Samsung TV)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Tizen 1 Step4.png||600px|center|]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Extra configurations must be done to run and debug the application on a Target Device, please reference the following [[TizenTv_Debugging|guide]] for more information&lt;br /&gt;
&lt;br /&gt;
== Step 5: Debug App==&lt;br /&gt;
Right click anywhere in the Simulator to open the Web Inspector &amp;gt; navigate to the Console tab &amp;gt; check for BSDK initialization and content measurement.&lt;br /&gt;
[[File:Tizen 1 Step5.png||600px|center|]]&lt;br /&gt;
&lt;br /&gt;
Debug Logging: Disable logging by deleting &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{nol_sdkDebug: 'debug'}&amp;lt;/syntaxhighlight&amp;gt; from initialization call&lt;br /&gt;
&lt;br /&gt;
== Remote control events ==&lt;br /&gt;
Build out the app further by including [https://developer.samsung.com/smarttv/develop/guides/user-interaction/remote-control.html remote control events] and attaching the player events to corresponding &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;keyCode &amp;lt;/syntaxhighlight&amp;gt; or using Tizen registered keys:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var media = document.querySelector('video');&lt;br /&gt;
window.addEventListener(&amp;quot;keydown&amp;quot;, function (e) {&lt;br /&gt;
    switch (e.keyCode) {&lt;br /&gt;
        case 10252: // MediaPlayPause&lt;br /&gt;
            if(!media.paused) {&lt;br /&gt;
                media.pause(); // pause video&lt;br /&gt;
                nSdkInstance.ggPM(&amp;quot;pause&amp;quot;, playheadPosition); // SDK call&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            media.play(); // play video&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;play&amp;quot;, contentMetadata); // SDK call&lt;br /&gt;
            break;&lt;br /&gt;
        case 10009: // Back&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;stop&amp;quot;, playheadPosition); // SDK call&lt;br /&gt;
            break;&lt;br /&gt;
        ...&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Next steps ==&lt;br /&gt;
&lt;br /&gt;
For further testing Samsung Tizen TV apps, refer to this [https://docs.tizen.org/application/web/tutorials/process/run-debug-app/ guide]. If there are any questions or concerns then please reach out to the BSDK team. Reference the following guides for product specific information:&lt;br /&gt;
&lt;br /&gt;
* [[DCR_Video_Browser_SDK|DCR Video]]&lt;br /&gt;
* [[DCR_Static_Browser_SDK_(6.0.0)|DCR Static]]&lt;br /&gt;
* [[DTVR_Browser_SDK|DTVR]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For further technical details or a sample application, please contact your Technical Account Manager (TAM).&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Audio_Software_Encoder&amp;diff=6626</id>
		<title>Nielsen Audio Software Encoder</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Audio_Software_Encoder&amp;diff=6626"/>
		<updated>2024-04-10T23:36:01Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Radio}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Radio]]&lt;br /&gt;
&lt;br /&gt;
{{Banner|Nielsen Audio Support|Radio}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Nielsen Audio Software Encoder==&lt;br /&gt;
In today’s Audio landscape, radio stations encode their audio signals utilizing hardware provided by&lt;br /&gt;
Nielsen placed in individual station’s equipment racks. This equipment adds the Nielsen inaudible code to the audio stream just prior to its being released. With the Audio Software Encoder Nielsen has launched a program to decouple its PPM Encoding Algorithm from the Nielsen Hardware Encoder it lives in today, and make it available for integration into 3rd party broadcasting equipment. When this software is incorporated into a station’s audio processing equipment, the Audio Software Encoder will be able to add the enhanced CBET code to the audio stream.&lt;br /&gt;
&lt;br /&gt;
The move from hardware to software based encoding will provide greater flexibility as stations evolve their technology ecosystems, free up rack space in their facilities, and enable a move to cloud based workflows.&lt;br /&gt;
&lt;br /&gt;
Nielsen actively works with audio processor vendors to provide clients with the various options to integrate. The certification process requires extensive testing to ensure the same rigor and&lt;br /&gt;
quality Nielsen provides to our audio broadcasters will continue to be in place.&lt;br /&gt;
&lt;br /&gt;
==Key Benefits==&lt;br /&gt;
*Enables opportunity for PPM encoding in cloud based workflows&lt;br /&gt;
*Brings audio encoding options in line with television encoding which have already realized the benefits of a software encoder&lt;br /&gt;
*Reduces rack space&lt;br /&gt;
*Simplifies broadcast station workflows&lt;br /&gt;
&lt;br /&gt;
==More Information==&lt;br /&gt;
For more information contact your Audio Client Engineer at 1-866-767-7212, or email encoding@nielsen.com&lt;br /&gt;
&lt;br /&gt;
==Nielsen Radio Certified Vendors==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
&amp;lt;!--  --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! OEM Vendor !! Product !! Product Version !! AM !! FM !! HD !! Internet Streaming !! Domestic !! International !! Radio Encoding &lt;br /&gt;
|-&lt;br /&gt;
| '''ATC Labs''' || '''Perceptual SoundMax'''|| '''2.12''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''iHeartRadio''' || '''Sound+ EdgePlayer'''|| '''1''' || '''✔''' || '''✔''' || ''' ''' || ''' ''' || '''✔''' || ''' ''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]  &lt;br /&gt;
|-&lt;br /&gt;
| '''Orban''' || '''5500i'''|| '''4.0''' ||  || '''✔''' ||  ||  || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Orban''' || '''5700i'''|| '''3.0''' ||  || '''✔''' || '''✔''' ||  || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Orban''' || '''8600si'''|| '''3.0.0.1''' ||  || '''✔''' || '''✔''' ||  || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Orban''' || '''PCn1600'''|| '''2.0''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' ||[[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.0.7 (02-12-2020)|1.1.7]]  &lt;br /&gt;
|-&lt;br /&gt;
| '''Orban''' || '''XPN'''|| '''2.0''' || '''✔''' ||  || '''✔''' ||  || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.0.7 (02-12-2020)|1.0.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''RCS Sound Software''' || '''SoundCenter'''|| '''v0.0.1''' || '''✔''' || '''✔''' || '''✔''' || ''' ''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]  &lt;br /&gt;
|-&lt;br /&gt;
| '''Telos/Omnia''' || '''Omnia 9'''|| '''3.30.79''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telos/Omnia''' || '''Omnia 9s'''|| '''3.30.61''' ||  || '''✔''' || '''✔''' || ''' ''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| '''Telos/Omnia''' || '''ZIP/stream X/2'''|| '''1.25.07''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telos/Omnia''' || '''ZIP/stream R/2'''|| '''1.09.04''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Telos/Omnia''' || '''ZIP/stream X/20'''|| '''2.1.3''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telos/Omnia''' || '''ZIP/stream R/20'''|| '''2.1.4''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Thimeo''' || '''Stereo Tool- Enterprise'''|| '''10.0''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (07-25-22)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Thimeo''' || '''STXtreme (Hardware Processor)'''|| '''10.1''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (12-22-22)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Wheatstone''' || '''Layers Stream Core'''|| '''1.0.1.0''' ||  ||  ||  || '''✔''' || '''✔''' || '''✔''' ||  [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Wheatstone''' || '''Streamblade'''|| '''1.0.2''' ||  ||  ||  || '''✔''' || '''✔''' || '''✔''' ||  [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Wheatstone''' || '''Wheatstream'''|| '''1.0.2''' ||  ||  ||  || '''✔''' || '''✔''' || '''✔''' ||  [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Wheatstone''' || '''X5'''|| '''1.3.0''' ||  || '''✔''' || '''✔''' ||  || '''✔''' || '''✔''' ||  [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.5 (02-12-2020)|1.1.5]] &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DCR_Taiwan_Video_iOS_SDK&amp;diff=6625</id>
		<title>DCR Taiwan Video iOS SDK</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DCR_Taiwan_Video_iOS_SDK&amp;diff=6625"/>
		<updated>2024-04-10T23:35:21Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International_DCR}} {{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. 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 covers implementation steps for iOS using Xcode utilizing the Standard Nielsen SDK for DCR.&lt;br /&gt;
&lt;br /&gt;
{{iOS_SpecialNotes_for_iOS14}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_SpecialNotes_for_iOS17}}&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
Before you start the integration, you will need:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
 || '''App ID (appid)''' || Unique ID assigned to the player/site and configured by product. || Provided by Nielsen&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
 || '''Nielsen SDK''' || Includes SDK frameworks and '''sample implementation'''; ''See [[iOS SDK Release Notes]]'' || [[Special:Downloads|Download]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If need App ID(s) or our SDKs, feel free to reach out to us and we will be happy to help you get started.&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;
Version 8 of the Nielsen App SDK will come in three versions. One that is enabled to work with the App Tracking Transparency Framework, another version that does not use the Ad Framework, and a version for Kids Apps or where noID is required. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! SDK Flavor&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''iOS Ad Version'''&lt;br /&gt;
|* Opt-In and Opt-Out functionality managed by the [https://developer.apple.com/documentation/apptrackingtransparency AppTrackingTransparency framework] . '''(Preferred approach)''' &amp;lt;br /&amp;gt;* The Nielsen SDK will attempt to collect the IDFA (Id for Advertisers) on the device.&amp;lt;br&amp;gt; * For iOS14+, if the value returned is &amp;lt;code&amp;gt;ATTrackingManager.AuthorizationStatus.authorized&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;*  If the device is running iOS12 or iOS13, the Limit Ad Tracking setting is requested.&lt;br /&gt;
|-&lt;br /&gt;
| '''iOS No Ad Framework'''&lt;br /&gt;
|* Without the Ad Framework, the Nielsen SDK cannot read the IDFA, so it will attempt to retrieve the '''IDFV'''.&amp;lt;br /&amp;gt;* The [https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor ID for Vendors (IDFV)], may be used for analytics across apps from the same content provider.&amp;lt;br /&amp;gt;* The developer is required to present the User Choice Opt Out page which is described in the [[DCR_Taiwan_Video_iOS_SDK#Global_iOS_SDK_No_Ad_Framework_Optout|Privacy Section]].&lt;br /&gt;
|-&lt;br /&gt;
| '''iOS SDK noID'''&lt;br /&gt;
|* This version of the Nielsen SDK is perfect for Kid apps, or where no ID is required.&amp;lt;br&amp;gt;* Please review the [[DCR_Taiwan_Video_iOS_SDK#Global_iOS_SDK_No_ID_Optout_.28Kids_Category.29|Opt Out Requirement]].&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 CocoaPods. We recommend using the CocoaPods-based integration whenever possible to ensure you maintain the most recent changes and enhancements to the Nielsen libraries.&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain CocoaPods implementation guide]]&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[DCR_Video_iOS_SDK_xcframework|Using the XCFramework bundle]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&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_Taiwan_Video_iOS_SDK#Removing_Simulators_.28Dynamic_Framework_Only.29|found below]].&lt;br /&gt;
&lt;br /&gt;
'''[[DCR_Video_iOS_SDK_xcframework|XCFramework]]''' is solution for the problems described above Apple recommends to use XCFrameworks. In XCFramework, we no longer build a single framework with multiple architectures. Instead, we build one small framework for each combination of architecture and target and store it in its own folder. The top-level XCFramework folder have folders like ios-arm64, ios-arm64-simulator, etc. Each of these folders is its own framework, complete with headers, modules, and binary.&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, when using the dynamic framework,  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. (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.  (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.  (''Not required if using CocaPods'')&lt;br /&gt;
&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;
Add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
@import NielsenAppApi;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iOS_SDK_Initialization}}&lt;br /&gt;
&lt;br /&gt;
== Configure 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 Nielsen Key names (e.g. appid, program) 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;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Create channelName 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;
=== Create Content Metadata ===&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.&lt;br /&gt;
&amp;lt;blockquote&amp;gt; program and title metadata values should be passed to SDK as UTF-8 strings. &amp;lt;/blockquote&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;
| 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;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| subbrand	|| 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)&lt;br /&gt;
||&lt;br /&gt;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| type ||	type of asset	|| &amp;quot;content&amp;quot;	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid	|| unique ID assigned to asset 	|| custom&amp;lt;br&amp;gt;(no [[Special Characters]]). The Content ID should be populated here which should correspond to the same value in the post transmission logs. || ✓&lt;br /&gt;
|-&lt;br /&gt;
| program	|| name of program 	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| title	|| episode name	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| length	|| length of content in seconds	|| seconds (86400 for live stream)||	✓&lt;br /&gt;
|-&lt;br /&gt;
| segB	|| custom segment B. Custom segments can be used to aggregate content however you choose. Some examples include genre, category, or platform.	|| custom	||&lt;br /&gt;
|-&lt;br /&gt;
| segC	|| custom segment C. Custom segments can be used to aggregate content however you choose. Some examples include genre, category, or platform.	|| custom	 ||&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode	|| full episode flag ||	&lt;br /&gt;
*'y', 'yes', or 'lf' – full episode&lt;br /&gt;
*'n', 'no', or 'sf' – non full episode	&lt;br /&gt;
'''Note:''' For livestream content with Dynamic Ad Insertion (DAI), the isfullepisode value should be set to 'y'. &lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|-&lt;br /&gt;
|adloadtype	|| type of Ad load:&lt;br /&gt;
* 1) Linear – matches TV Ad load. Content with linear Ad Load is not eligible for DCR measurement and will not be included in DCR reporting.&lt;br /&gt;
* 2) Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
||&lt;br /&gt;
*&amp;quot;1&amp;quot; – content with linear Ads. Note: Content with linear Ad load is not included in DCR measurement. &lt;br /&gt;
*&amp;quot;2&amp;quot; – content with dynamic Ads	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Metadata Example ====&lt;br /&gt;
&amp;lt;code&amp;gt;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;
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;C77664&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Program S2, E3&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&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;adloadtype&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;, //optional&lt;br /&gt;
    &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;, //optional&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Objective-C&amp;lt;/code&amp;gt;    &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
NSDictionary * contentMetadata = @ {&lt;br /&gt;
    @ &amp;quot;type&amp;quot;: @ &amp;quot;content&amp;quot;,&lt;br /&gt;
    @ &amp;quot;assetid&amp;quot;: @ &amp;quot;C77664&amp;quot;,&lt;br /&gt;
    @ &amp;quot;title&amp;quot;: @ &amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    @ &amp;quot;isfullepisode&amp;quot;: @ &amp;quot;y&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;adloadtype&amp;quot;: @ &amp;quot;2&amp;quot;,&lt;br /&gt;
    @ &amp;quot;segB&amp;quot;: @ &amp;quot;CustomSegmentValueB&amp;quot;, //optional&lt;br /&gt;
    @ &amp;quot;segC&amp;quot;: @ &amp;quot;CustomSegmentValueC&amp;quot;, //optional&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Configure metadata === &lt;br /&gt;
channelName should remain constant throughout the completion of an episode or live stream.&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	|| ChannelInfo refers to the Channel name. This can be a free-form value&lt;br /&gt;
value such as a friendly name for the content being played. the SDK&amp;lt;br/&amp;gt;&lt;br /&gt;
will pass the application name automatically.&lt;br /&gt;
|| custom	|| No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&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.&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	||  &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;'midroll'&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;'postroll'&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;'ad'&amp;lt;/code&amp;gt;  - If specific type can not be identified.||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to Ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| ✓&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;
// create Ad object&lt;br /&gt;
&amp;quot;ad&amp;quot;: {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iOS_LifeCycle_of_SDK}}&lt;br /&gt;
&lt;br /&gt;
== Configure API Calls ==&lt;br /&gt;
&amp;lt;!--[[File:appsdkTimeline-DCR.png|icon|link=]]--&amp;gt;&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;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;nielsenMeter.play()&amp;lt;/code&amp;gt; || // Call at start of each new stream&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nielsenMeter.loadMetadata(contentMetadata)&amp;lt;/code&amp;gt; || // MetadataObject contains the JSON metadata&amp;lt;br&amp;gt; for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| Content || &amp;lt;code&amp;gt;nielsenMeter.playheadPosition(pos);&amp;lt;/code&amp;gt; || // playheadPosition is position of the playhead &amp;lt;br&amp;gt;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;
=== SDK Events ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'play'	|| 	|| Call at start of each new stream&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
| 'playheadPosition'	|| playhead position as integer&amp;lt;br/&amp;gt;&lt;br /&gt;
VOD: current position in seconds &amp;lt;br/&amp;gt;&lt;br /&gt;
Live: current UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;lt;br/&amp;gt;&lt;br /&gt;
Note: 'PlayheadPosition' has to be called every second&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' ||	playhead position	|| Call during any interruption to content or Ad playback and at the end of each Ad.&lt;br /&gt;
|-&lt;br /&gt;
| 'end'	|| playhead position in seconds	|| Call when the current video asset completes playback and pass the playhead position. &amp;lt;br/&amp;gt;&lt;br /&gt;
Example: At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: For livestream, send the UNIX timestamp, for VOD send the time in seconds as integer. The final playhead position must be sent for the current asset being played before calling &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; or&amp;lt;code&amp;gt; '''loadmetadata'''&amp;lt;/code&amp;gt;,.&amp;lt;/blockquote&amp;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 '''Idle 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 an event to occur.&lt;br /&gt;
# '''Processing state''' – The SDK instance is processing playing information. The &amp;lt;code&amp;gt;'''play'''&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; 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;
## &amp;lt;code&amp;gt;'''playheadPosition'''&amp;lt;/code&amp;gt; – Call this API every one second when playhead position is active.  If a LIVE event, use the current UNIX timestamp (seconds since Jan-1-1970 UTC).&lt;br /&gt;
## &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt; – Call this API when the content or Ad playback is interrupted and at the end of each Ad. &lt;br /&gt;
## &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; – Call when content completes. When called, the SDK instance exits from Processing state.&lt;br /&gt;
# '''Disabled state''' – The SDK instance is disabled and is not processing playing information. &lt;br /&gt;
## &amp;lt;code&amp;gt;'''appDisableApi'''&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&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 &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; and   &amp;lt;code&amp;gt;'''playheadPosition'''&amp;lt;/code&amp;gt; &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()]] at start of stream&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;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 [[playheadPosition|playheadPosition()]] 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(); &amp;lt;/code&amp;gt; || // Call at start of each new stream&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;
|-style=&amp;quot;background-color:#d8f5d7;&amp;quot;&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;
| Interruption || &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // call stop when content playback is interrupted&lt;br /&gt;
|-style=&amp;quot;background-color:#d8f5d7;&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Resume Content || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt;  || // Call loadMetadata and pass content metadata object when content resumes&lt;br /&gt;
|- style=&amp;quot;background-color:#d8f5d7;&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // continue pasing playhead position every second starting from position where content is resumed&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()]] at start of stream&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;ad123&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 [[playheadPosition|playheadPosition()]] 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(); &amp;lt;/code&amp;gt; || // stream starts&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.playheadPosition(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;2&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.playheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&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.playheadPosition(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; || // Call stop after midroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Content Resumes || &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.playheadPosition(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; || // 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.playheadPosition(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 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;
{{iOS_Sequence_of_Calls}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_Foreground_and_Background}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_Interuptions_during_Playback}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_NielsenAppSDKJSHandler}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_PreCertification_Checklists}}&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
There are currently 3 flavors of the Nielsen SDK: &lt;br /&gt;
# '''[[#Global_iOS_SDK_Opt-out|Global iOS SDK Opt-out]]''' - managed by ''AppTracking'' or ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Global_iOS_SDK_No_Ad_Framework_Optout|Global iOS SDK No Ad Framework Optout]]''' - Direct call to SDK. Can be used without the Ad Framework&lt;br /&gt;
# '''[[#Global_iOS_SDK_No_ID_Optout_.28Kids_Category.29|Global iOS SDK No ID Optout]]''' - Direct call to SDK. Should be used for Kids Category.&lt;br /&gt;
&lt;br /&gt;
=== Global iOS SDK Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS &lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's '''Limit Ad Tracking''' or '''AppTracking''' setting. &lt;br /&gt;
*  If the User's device is running &amp;lt; iOS 13.x, the Nielsen SDK will check the status of '''Limit Ad Tracking'''.&lt;br /&gt;
*  iOS14 modifies the way Apple manages the collection of a User's Opt-In status through '''AppTracking'''. Starting with Version 8.x+, the Nielsen App SDK will check the iOS version during initialization. If the device is running iOS12 or iOS13, the Limit Ad Tracking setting is requested. If iOS14.x +, then AppTracking is utilized.&lt;br /&gt;
==== Webview Element ====&lt;br /&gt;
It is a requirement to display a WebView element whose loadUrl is set to the value obtained from optOutURL.&lt;br /&gt;
If using the Global iOS SDK, this optOutURL informs the user how to deactivate/activate “App Tracking/Limit Ad Tracking”.&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;&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s Digital Content Ratings. Please see https://www.nielsen.com/tw/en/legal/privacy-statement/digital-measurement/ for more information&amp;quot;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Global iOS SDK No Ad Framework Optout ===&lt;br /&gt;
The ''User Choice'' method can be used without the Ad Framework, or in situations where the publisher does not wish to use the [https://developer.apple.com/documentation/apptrackingtransparency App Tracking Transparency Framework]. As this flavor of the Nielsen SDK does not use the Ad Framework, so it is necessary to display an Optout Page to the userand capture their selection.&lt;br /&gt;
&lt;br /&gt;
Similar to the Global iOS SDK Flavor, it is a requirement to display a WebView element whose loadUrl is set to the&lt;br /&gt;
value obtained from optOutURL. This is a special URL that indicates Opt-in, or Opt-out and close the WebView.&lt;br /&gt;
&lt;br /&gt;
==== This opt-out method works as follows: ====&lt;br /&gt;
* Get the 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;
=== Global iOS SDK No ID Optout (Kids Category) ===&lt;br /&gt;
If you are building an app that will be listed in the Kids Category:&lt;br /&gt;
#  Ensure that you are using the [https://nielsendownloads-green.digitalengsdk.com/digital/Nielsen-iOS-App-SDK-GlobalNoId_latest.zip NoID version] of the Nielsen SDK Framework.&lt;br /&gt;
#  Immediately following the initialization of the Nielsen SDK ensure you call the userOptOut API with Opt out selection: &lt;br /&gt;
&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;
== Opt-out example code ==&lt;br /&gt;
===== Swift =====&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;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var webView: WKWebView!&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;
&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;
        func closeOptOutView() {&lt;br /&gt;
            self.dismiss(animated: true, completion: nil)&lt;br /&gt;
        }&lt;br /&gt;
  &lt;br /&gt;
// Uncomment below code if you are using the Global iOS SDK No Ad Framework Flavor.  This will receive the user's selection&lt;br /&gt;
// From the custom User_Choice opt out page.  Only required for non-ad framework or no-id builds&lt;br /&gt;
// of the Nielsen SDK&lt;br /&gt;
/*  &lt;br /&gt;
        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: &lt;br /&gt;
@escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
            print(navigationAction.request.url?.absoluteString as Any) //For debugging to check what is being passed from webpage.&lt;br /&gt;
            if navigationAction.request.url?.absoluteString == &amp;quot;nielsen://close&amp;quot; {&lt;br /&gt;
                closeOptOutView()&lt;br /&gt;
                decisionHandler(.cancel)&lt;br /&gt;
            } else {&lt;br /&gt;
                if let url = navigationAction.request.url?.absoluteString, url.hasPrefix(&amp;quot;nielsen&amp;quot;) {&lt;br /&gt;
                    nielsenApi?.userOptOut(url). //either nielsenappsdk://1 or nielsenappsdk://0&lt;br /&gt;
                    decisionHandler(.cancel)&lt;br /&gt;
                } else {&lt;br /&gt;
                    if navigationAction.navigationType == .linkActivated {&lt;br /&gt;
                        if let url = navigationAction.request.url?.absoluteString, url.hasSuffix(&amp;quot;#&amp;quot;) {&lt;br /&gt;
                            decisionHandler(.allow)&lt;br /&gt;
                        } else {&lt;br /&gt;
                            decisionHandler(.cancel)&lt;br /&gt;
                            webView.load(navigationAction.request)&lt;br /&gt;
                        }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        decisionHandler(.allow)&lt;br /&gt;
                    }}}}&lt;br /&gt;
  */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Objective-C =====&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.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;
@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;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL&lt;br /&gt;
 URLWithString:self.nielsenApi.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Uncomment below code if you are using the Global iOS SDK No Ad Framework Flavor.&lt;br /&gt;
// From the custom User_Choice opt out page.  Only required for non-ad framework or no-id builds&lt;br /&gt;
// of the Nielsen SDK&lt;br /&gt;
/*     &lt;br /&gt;
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction&lt;br /&gt;
 decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler&lt;br /&gt;
{&lt;br /&gt;
    if ([navigationAction.request.URL.absoluteString isEqualToString:kNielsenWebClose])&lt;br /&gt;
    {   [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        decisionHandler(WKNavigationActionPolicyCancel); &lt;br /&gt;
     } else {&lt;br /&gt;
        if ([navigationAction.request.URL.absoluteString hasPrefix:@&amp;quot;nielsen&amp;quot;])&lt;br /&gt;
        {[self.nielsenAppApi userOptOut:navigationAction.request.URL.absoluteString];&lt;br /&gt;
            decisionHandler(WKNavigationActionPolicyCancel); &lt;br /&gt;
        } else {&lt;br /&gt;
            if (navigationAction.navigationType == WKNavigationTypeLinkActivated) &lt;br /&gt;
            { if ([navigationAction.request.URL.absoluteString hasSuffix:@&amp;quot;#&amp;quot;]) &lt;br /&gt;
                      {decisionHandler(WKNavigationActionPolicyAllow);&lt;br /&gt;
                } else {&lt;br /&gt;
                    decisionHandler(WKNavigationActionPolicyCancel);&lt;br /&gt;
                    [webView loadRequest:[NSURLRequest requestWithURL:navigationAction.request.URL]];&lt;br /&gt;
                }} else {&lt;br /&gt;
                 decisionHandler(WKNavigationActionPolicyAllow);&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;
== Retrieve current Opt-Out preference ==&lt;br /&gt;
Whether the user is opted out via OS-level Opt-out or via User Choice Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&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;
&lt;br /&gt;
{{iOS_Airplay}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_Going_Live}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_Removing_Simulator_Slices}}&lt;br /&gt;
&lt;br /&gt;
== Sample Applications ==&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;
** [[Swift Basic Sample|Swift 5.0 Sample]]&lt;br /&gt;
** [[Objective-c Basic example|Objective-C Sample]]&lt;br /&gt;
&lt;br /&gt;
* '''Advanced''' - Nielsen Simplified API integrated into a custom video player.&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Template:iOS_SpecialNotes_for_iOS17&amp;diff=6624</id>
		<title>Template:iOS SpecialNotes for iOS17</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Template:iOS_SpecialNotes_for_iOS17&amp;diff=6624"/>
		<updated>2024-04-10T23:34:19Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Special Notes regarding iOS17 or TVOS17 ==&lt;br /&gt;
Beginning with iOS/TVOS 17, Apple is adding several requirements for App developers around tracking, use of Identifier For Advertisers (IDFA), and certain system APIs.&lt;br /&gt;
&lt;br /&gt;
This requirement entails users manually opting in to declare all domains employed for tracking purposes, which includes the collection of IDFAs (Identifier for Advertisers).&lt;br /&gt;
Currently, even if users choose not to opt in for tracking, it's essential to note that our Nielsen Digital SDKs continue to carry out measurements and transmit data without relying on IDFA. However, this new privacy measure introduced by Apple necessitates that we bring this development to your attention, as it could potentially impact your Nielsen measurement and tracking for iOS app usage.&lt;br /&gt;
&lt;br /&gt;
In order to minimize the impact, we are asking that clients do the following:&lt;br /&gt;
&lt;br /&gt;
* '''Do not declare the Nielsen imrworldwide.com domain in the privacy manifest.'''&lt;br /&gt;
* Update to the latest Nielsen SDK release &amp;gt;= 9.2.0.0 when compiling your app for iOS 17.&lt;br /&gt;
&lt;br /&gt;
For any additional information please refer to the Nielsen global page: [[DCR and DTVR with iOS17 or TVOS17]].&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DCR_France_SDK_Downloads&amp;diff=6623</id>
		<title>DCR France SDK Downloads</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DCR_France_SDK_Downloads&amp;diff=6623"/>
		<updated>2024-04-10T23:32:11Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|Mediametrie Implementation Documentation}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK Download Page is specific to Mediametrie and only available to its Clients. Please contact Médiamétrie if you have any questions.&lt;br /&gt;
&lt;br /&gt;
== Artifactory ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Artifactory is the preferred approach to enable continuous integration.&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
! style=&amp;quot;width: 200px;&amp;quot; | Release Notes&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |&lt;br /&gt;
{{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|StaticIcon.png|alt=Static Content}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[Digital Measurement iOS Artifactory Guide]]'''&lt;br /&gt;
| [[iOS SDK Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[Digital Measurement Android Artifactory Guide]]'''&lt;br /&gt;
| [[Android SDK Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| |Browser SDK does not require Artifactory - see implementation guide&lt;br /&gt;
| [[Browser SDK Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Starting on Sept 9, 2021 the Nielsen SDK has moved to a public repository. Credentials are no longer required.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== AppSDK Flavors ==&lt;br /&gt;
&lt;br /&gt;
* [[DCR AppSDK Flavors#Android AppSDK Flavors|Android AppSDK Flavors]]&lt;br /&gt;
* [[DCR AppSDK Flavors#iOS AppSDK Flavors|iOS AppSDK Flavors]]&lt;br /&gt;
&lt;br /&gt;
== SDK Downloads ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Downloadable SDK binaries for legacy integrations.&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Download Link&lt;br /&gt;
! style=&amp;quot;width: 200px;&amp;quot; | Release Notes&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |&lt;br /&gt;
{{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|StaticIcon.png|alt=Static Content}}&lt;br /&gt;
|{{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
|&lt;br /&gt;
* [https://nielsendownloads.digitalengsdk.com/digital/Nielsen-iOS-App-SDK-Global_latest.zip Global iOS SDK Download (Preferred)] &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-size:70%&amp;quot;&amp;gt; [https://nielsendownloads-green.digitalengsdk.com/digital/Nielsen-iOS-App-SDK-GlobalNoAd_latest.zip Global iOS SDK No Ad Framework]&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-size:70%&amp;quot;&amp;gt;[https://nielsendownloads-green.digitalengsdk.com/digital/Nielsen-iOS-App-SDK-GlobalNoId_latest.zip Global iOS SDK No ID - Use for kids apps]&lt;br /&gt;
| [[iOS SDK Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
|&lt;br /&gt;
* [https://nielsendownloads.digitalengsdk.com/digital/Nielsen-Android-App-SDK_Global_latest.zip Global Android SDK Download (Preferred)]&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-size:70%&amp;quot;&amp;gt;[https://nielsendownloads-green.digitalengsdk.com/digital/Nielsen-Android-App-SDK_GlobalNoAd_latest.zip Global Android No AD]&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-size:70%&amp;quot;&amp;gt;[https://nielsendownloads-green.digitalengsdk.com/digital/Nielsen-Android-App-SDK_GlobalNoId_latest.zip Global Android No ID]&lt;br /&gt;
| [[Android SDK Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=TVOS}}&lt;br /&gt;
|&lt;br /&gt;
* [https://nielsendownloads.digitalengsdk.com/digital/Nielsen-TVOS-App-SDK-Global_latest.zip Global TVOS SDK Download (Preferred)] &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-size:70%&amp;quot;&amp;gt;[https://nielsendownloads-green.digitalengsdk.com/digital/Nielsen-TVOS-App-SDK-GlobalNoAd_latest.zip Global TVOS No Ad FrameWork]&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-size:70%&amp;quot;&amp;gt;[https://nielsendownloads-green.digitalengsdk.com/digital/Nielsen-TVOS-App-SDK-GlobalNoId_latest.zip Global TVOS No ID Download]&lt;br /&gt;
| [[TVOS SDK Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| Browser SDK does not require download - see implementation guide&lt;br /&gt;
| [[Browser SDK Release Notes]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DCR_Germany_Video_App_SDK&amp;diff=6622</id>
		<title>DCR Germany Video App SDK</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DCR_Germany_Video_App_SDK&amp;diff=6622"/>
		<updated>2024-04-10T23:31:25Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|AGF Implementation Documentation}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of the 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 the 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;
* &amp;lt;blockquote&amp;gt;'''No ID AppSDK''': &amp;lt;pre style=&amp;quot;color: red&amp;quot;&amp;gt;ONLY the No ID AppSDK should be downloaded for the AGF market!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
Please contact our SDK sales support team if you do not have any of these prerequisites or have any questions.&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;
=== iOS  ===&lt;br /&gt;
&lt;br /&gt;
==== Special Notes regarding iOS17 or TVOS17  ====&lt;br /&gt;
Beginning with iOS/TVOS 17, Apple is adding several requirements for App developers around tracking, use of Identifier For Advertisers (IDFA), and certain system APIs.&lt;br /&gt;
&lt;br /&gt;
Since AGF market is not making use of the IDFA, the change is expected to have no impact.&lt;br /&gt;
&lt;br /&gt;
However, in order to minimize any eventual impact, we are asking that AGF clients do the following:&lt;br /&gt;
&lt;br /&gt;
* '''Do not declare the Nielsen nmrodam.com domain in the privacy manifest'''&lt;br /&gt;
* Update to the latest Nielsen SDK release &amp;gt;= 9.2.0.0 when compiling your app for iOS 17&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For any additional information please refer to the Nielsen global page: [[DCR and DTVR with iOS17 or TVOS17]].&lt;br /&gt;
&lt;br /&gt;
==== General  ====&lt;br /&gt;
&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;
* SystemConfiguration.framework&lt;br /&gt;
* Security.framework&lt;br /&gt;
** Nielsen Analytics framework uses several 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 the 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;
&lt;br /&gt;
=== Android  ===&lt;br /&gt;
==== General  ====&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
'''Configuring Android Java Development Environment'''&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&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 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 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 Google Play support to work properly.&lt;br /&gt;
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;&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 on handling 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 a Google service is available and updated.&lt;br /&gt;
* If unavailable or updated, App SDK will not use this service when executing its functions and will reference 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;
* 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;
==== Add the dependency &amp;quot;lifecycle-extensions&amp;quot; to your project  ====&lt;br /&gt;
Add the dependency &amp;quot;lifecycle-extensions&amp;quot; in the in the app gradle file as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
implementation &amp;quot;androidx.lifecycle:lifecycle-extensions:2.1.0&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will enable the AppSdk to detect the application UI visibility state transitions between background and foreground by utilizing the LifeCycleObserver. This is i.e. required for the Static Measurement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Review SDK Integration Architecture Diagram ==&lt;br /&gt;
&lt;br /&gt;
=== For Content Playback ===&lt;br /&gt;
&lt;br /&gt;
[[File:nlsn-sdk-achitecture-diagram-content-agf-v0.png||SDK Integration Architecture Diagram - Content]]&lt;br /&gt;
&lt;br /&gt;
=== For Ad Playback ===&lt;br /&gt;
[[File:nlsn-sdk-achitecture-diagram-agf-ad-v0.png||SDK Integration Architecture Diagram - Ad]]&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 before 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 || ✓ || &amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;&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;
'''AGF Clients'''&lt;br /&gt;
* &amp;quot;eu&amp;quot; (For Testing/Certification and in Production)&lt;br /&gt;
|| Nielsen-specified || ✓ || &amp;quot;eu&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_devDebug || Enables Nielsen console logging. Has to be set to &amp;quot;DEBUG&amp;quot; until certified&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;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
=====  iOS =====&lt;br /&gt;
====== Swift ======&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;PDA7D5EE6-B1B8-XXXX-XXXX-2A788BCXXXCA&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;eu&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;
======  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;eu&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;
&lt;br /&gt;
=====  Android =====&lt;br /&gt;
====== Java ======&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;eu&amp;quot;)&lt;br /&gt;
          .put(&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;
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 the 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 the 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 handle 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 the unexpected type is passed to the method, the error message will be logged.&lt;br /&gt;
** The error message will be logged if the string has an invalid JSON format.&lt;br /&gt;
* JSON value must be a 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;
=== Configure ChannelInfo metadata === &lt;br /&gt;
==== Description of ChannelInfo 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;
==== Example ChannelInfo metadata ====&lt;br /&gt;
===== iOS =====&lt;br /&gt;
====== Swift ======&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;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
====== Objective-C ======&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
NSDictionary  *channelInfo = @&lt;br /&gt;
{&lt;br /&gt;
  @&amp;quot;channelName&amp;quot;:@&amp;quot;My Channel Name 1&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Android =====&lt;br /&gt;
====== Java ======&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;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
=== Configure Content metadata ===&lt;br /&gt;
&lt;br /&gt;
==== Description of 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;
For detailed information on metadata and custom variables, see '''[[AGF Metadata Convention#Video Measurement|AGF Metadata Convention for Video Measurement]]'''&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;
| assetid || unique ID assigned to asset (64 character limit; only characters 0-9, a-z, A-Z underscore and minus are allowed - no special characters or vowel mutations)|| custom (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 - no backslash allowed in string (because of 3rd party data processing) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| length || length of content in seconds || &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; ('86400' for 24/7 Livestream. For Event-Livestreams planned length. For VoD video length) || ✓&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 with 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)&lt;br /&gt;
||&lt;br /&gt;
provided by Nielsen	&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| nol_c0  || number of episode part (Sendungsteilenummer)              || number                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c2  || web only                     || 'Y' or 'N'          || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c5  || page URL                     || custom                ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c7  || Video ID                     || custom                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c8  || not in use         		  || leave blank, reserved for AGF || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c9  || episode title                || custom - no backslash allowed in string (because of 3rd party data processing) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c10 || publisher                    || custom                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c12 || type of asset                || 'Trailer' or 'Content'             || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c13 || custom variable              || custom ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c14 || not in use         		  || leave blank, reserved for AGF || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c15 || format ID                    || custom                ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c16 || content-ID (Combines different videos to a common category, content-wise, a content-ID is available for content, trailer and ads) || custom, i.e. 'dVxRcCpOqKyFz02fuss', 'dvrsowf_ten_rtlibes', etc ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c18 || livestream                   || 'Y' or 'N' || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c19 || custom variable              || custom                ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c20 || GfK-ID                     || custom                ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example Content metadata ====&lt;br /&gt;
===== iOS =====&lt;br /&gt;
====== Swift ======&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;program&amp;quot;: &amp;quot;Program Name&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;episode title&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;p0,1&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c2&amp;quot;: &amp;quot;p2,Y&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c7&amp;quot;: &amp;quot;p7,videoid123&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c8&amp;quot;: &amp;quot;p8,&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c9&amp;quot;: &amp;quot;p9,VideoTitle123&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c10&amp;quot;: &amp;quot;p10,clientname&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c12&amp;quot;: &amp;quot;p12,content&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c18&amp;quot;: &amp;quot;p18,N&amp;quot;&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
====== Objective-C ======&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
NSDictionary *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;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;episode title&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c0&amp;quot;: &amp;quot;p0,1&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c2&amp;quot;: &amp;quot;p2,Y&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c7&amp;quot;: &amp;quot;p7,videoid123&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c8&amp;quot;: &amp;quot;p8,&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c9&amp;quot;: &amp;quot;p9,VideoTitle123&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c10&amp;quot;: &amp;quot;p10,clientname&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c12&amp;quot;: &amp;quot;p12,content&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c18&amp;quot;: &amp;quot;p18,N&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Android =====&lt;br /&gt;
====== Java ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JSONObject contentMetadata = new JSONObject()&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;88675545&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;episode title&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;length&amp;quot;, &amp;quot;3600&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c0&amp;quot;, &amp;quot;p0,1&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c2&amp;quot;, &amp;quot;p2,Y&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c7&amp;quot;, &amp;quot;p7,videoid123&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c8&amp;quot;, &amp;quot;p8,&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c9&amp;quot;, &amp;quot;p9,VideoTitle123&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c10&amp;quot;, &amp;quot;p10,clientname&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c12&amp;quot;, &amp;quot;p12,content&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c18&amp;quot;, &amp;quot;p18,N&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
=== Configure Ad Metadata ===&lt;br /&gt;
==== Description of 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;
For detailed information on metadata and custom variables, see '''[[AGF Metadata Convention#Video Measurement|AGF Metadata Convention for Video Measurement]]'''&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 asset (64 character limit; only characters 0-9, a-z, A-Z underscore and minus are allowed - no special characters or vowel mutations)|| custom (no SPACE - no [https://engineeringportal.nielsen.com/docs/Special_Characters Special Characters]) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| subbrand	|| vcid/sub-brand ID – value is automatically populated through provided App ID. In order to override the sub-brand configured to the App ID, value can be passed here (e.g. multiple sub-brands in App) || provided by Nielsen	||&lt;br /&gt;
|-&lt;br /&gt;
| title || only the AD-ID is necessary || custom, &amp;lt;AD-ID&amp;gt; without &amp;quot;VAST&amp;quot; Prefix or other, i.e.  '2352723141' ||	✓&lt;br /&gt;
|-	&lt;br /&gt;
| length || length of Ad in seconds || length of Ad in seconds || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c1 || universal AdID (Additional AD-ID to be used by second or third marketers) || custom, i.e. 'adgapid_022_800160_1601097_001_0_0' ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c2  || web only                     || 'Y' or 'N'          || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c4 || form of advertising || 'preroll','midroll', 'postroll', 'pre-split', 'sponsor' ||	&lt;br /&gt;
|-&lt;br /&gt;
| nol_c8  || not in use         		  || leave blank, reserved for AGF || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c10 || publisher                    || custom                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c11 || AD-ID (unique ID of an advertisement. Necessary if ads are being broadcasted) || custom, i.e. '2352723141' || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c12 || content type (key distinction of content, advertising, and Trailer) || 'Werbung' ||  ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c16 || content-ID (Combines different videos to a common category, content-wise, a content-ID is available for content, trailer and ads) || custom, i.e. 'dVxRcCpOqKyFz02fuss', 'dvrsowf_ten_rtlibes', etc ||	&lt;br /&gt;
|-&lt;br /&gt;
| nol_c17 || ad placement type (placement information of advertisement) || 'preroll', 'midroll', 'postroll' or 'other' ||	✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Ad metadata ====&lt;br /&gt;
===== iOS =====&lt;br /&gt;
====== Swift ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt; &lt;br /&gt;
let adMetadata = [&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;: &amp;quot;ad345-67483&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;ad_title&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;: &amp;quot;25&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c8&amp;quot;: &amp;quot;p8,&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c10&amp;quot;: &amp;quot;p10,clientname&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c11&amp;quot;: &amp;quot;p11,2352723141&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c12&amp;quot;: &amp;quot;p12,Werbung&amp;quot;,&lt;br /&gt;
    &amp;quot;nol_c17&amp;quot;: &amp;quot;p17,preroll&amp;quot;&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
====== Objective-C ======&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
NSDictionary *adMetadata = @&lt;br /&gt;
  {@&amp;quot;type&amp;quot;: @&amp;quot;preroll&amp;quot;,&lt;br /&gt;
  @&amp;quot;assetid&amp;quot;: @&amp;quot;ad345-67483&amp;quot;&amp;quot;,&lt;br /&gt;
  @&amp;quot;title&amp;quot;: @&amp;quot;ad_title&amp;quot;,&lt;br /&gt;
  @&amp;quot;length&amp;quot;: @&amp;quot;25&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c8&amp;quot;: &amp;quot;p8,&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c10&amp;quot;: &amp;quot;p10,clientname&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c11&amp;quot;: &amp;quot;p11,2352723141&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c12&amp;quot;: &amp;quot;p12,Werbung&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_c17&amp;quot;: &amp;quot;p17,preroll&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Android =====&lt;br /&gt;
====== Java ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JSONObject adMetadata = new JSONObject()&lt;br /&gt;
    .put(&amp;quot;type&amp;quot;, &amp;quot;preroll&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;assetid&amp;quot;, &amp;quot;ad345-67483&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;title&amp;quot;, &amp;quot;2352723141&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;length&amp;quot;, &amp;quot;25&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c8&amp;quot;, &amp;quot;p8,&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c10&amp;quot;, &amp;quot;p10,clientname&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c11&amp;quot;, &amp;quot;p11,2352723141&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c12&amp;quot;, &amp;quot;p12,Werbung&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;nol_c17&amp;quot;, &amp;quot;p17,preroll&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;[nielsenMeter 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;[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 processes 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;
&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 pause the measurement.&lt;br /&gt;
* As soon as the playback resumes, call [[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;
'''[[#Example ChannelInfo metadata|Example ChannelInfo metadata]]'''&lt;br /&gt;
Call [[loadMetadata()]] with JSON metadata for content as below.&lt;br /&gt;
'''[[#Example Content metadata|Example Content metadata]]'''&lt;br /&gt;
&lt;br /&gt;
Call [[setPlayheadPosition()]] every one second until the stream playback is interrupted or has ended.&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;
'''[[#Example ChannelInfo metadata|Example ChannelInfo metadata]]'''&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: ONLY for a preroll Ad , Call [[loadMetadata()]] for Content before calling it for preroll ad &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Call [[loadMetadata()]] with JSON metadata for ad as below.&lt;br /&gt;
'''[[#Example Ad metadata|Example Ad metadata]]'''&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 the Ad playback is interrupted or has ended for each single Ad. 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 (Content resume) || &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.&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 descriptor information through channelName parameter after the SDK has been initialized and the content starts playing. If the user is returning from a '''Pause/Stop''' interaction, call [[loadMetadata]] with the same metadata and continue sending [[playheadPosition]] once the playback resumes.&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(JSONObject channelInfo);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== loadMetadata ===&lt;br /&gt;
Needs to be called at the beginning of each asset, pass JSON object for relevant content or ad. &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;
&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot; has to be called every second.&lt;br /&gt;
&lt;br /&gt;
* VOD : &lt;br /&gt;
** For Content and each single Ad, pass the current position in seconds. Pass whole number that increments only by 1 like 0,1,2,3...&lt;br /&gt;
*Live : &lt;br /&gt;
**For Content, pass the Unix timestamp (seconds since Jan-1-1970 UTC). Pass whole number that increments only by 1 like 1631098029,1631098030,1631098031,1631098032,... . &lt;br /&gt;
**For each single Ad, pass the current position in seconds. Pass whole number that increments only by 1 like 0,1,2,3...&lt;br /&gt;
&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;
&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;
Call when&lt;br /&gt;
* ads complete playing&lt;br /&gt;
* when a user pauses playback&lt;br /&gt;
* upon any user interruption scenario - see bellow chapter Interruption scenario&lt;br /&gt;
&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;
Call when the content asset completes playback. Stops measurement progress. &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 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;
== 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 and withhold sending playhead position.&lt;br /&gt;
* '''For video content:'''&lt;br /&gt;
** Call [[loadMetadata]] with the same metadata and continue sending [[playheadPosition]] once the playback resumes.&lt;br /&gt;
* '''For ads:'''&lt;br /&gt;
** just continue sending [[playheadPosition]] once the playback resumes (no [[loadMetadata]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Additional information:&lt;br /&gt;
* '''For type 'content': '''Sending a &amp;quot;loadMetadata&amp;quot; event after a &amp;quot;stop&amp;quot; event will be handled by the SDK as a &amp;quot;resume&amp;quot;, as long as the &amp;quot;assetid&amp;quot; and &amp;quot;type&amp;quot; are the same and not changed from the values before the &amp;quot;stop&amp;quot; event happened. Changing &amp;quot;assetid&amp;quot; value will lead into a new stream. Changing of &amp;quot;type&amp;quot; from &amp;quot;content&amp;quot; to &amp;quot;preroll&amp;quot; (&amp;quot;midroll&amp;quot;, &amp;quot;postroll&amp;quot;) will lead into a new object (ad) with that content stream. Changing any other parameter (eg. &amp;quot;program&amp;quot; or &amp;quot;title&amp;quot;) for the content will not affect the reported content data (will stay as in the very first &amp;quot;content&amp;quot; metadata)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== App termination ===&lt;br /&gt;
If your app is executing a termination process and therefore ending the Content or Ad Playback, call [[end]] if the Content is playing or [[stop]] if an Ad is playing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
The AppSDK measurement is working without cookies and other personal information. No user can be identified personally, therefore an opt-out functionality is not required. The Nielsen AppSDK measurement is utilizing a cookieless domain.&lt;br /&gt;
In order to disclose Nielsen measurement privacy statement, please include the following items in your privacy policy:&lt;br /&gt;
* A notice that the player includes third party measurement software that allows users to contribute to market research with anonymous data.&lt;br /&gt;
* A link to the Nielsen Digital Measurement Privacy Policy located at https://nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/?lang=de .&lt;br /&gt;
 &lt;br /&gt;
Please contact your Nielsen SDK support team directly for any related questions.&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;eu&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;eu&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 the Nielsen team - this is necessary because the Nielsen team has to adjust internal configuration parameters to enable data collection. Without that notification, no data will be collected, and no data will be reported.&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DCR_Germany_Video_Browser_SDK&amp;diff=6621</id>
		<title>DCR Germany Video Browser SDK</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DCR_Germany_Video_Browser_SDK&amp;diff=6621"/>
		<updated>2024-04-10T23:30:25Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|AGF Implementation Documentation}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of the 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 Browser SDK is the framework for browser developers to integrate Nielsen Measurement into their media player pages. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content 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;
&lt;br /&gt;
'''Please note:'''&lt;br /&gt;
The Browser SDK is intended to be used for native Browser implementations and cannot be used in a hybrid framework environment on Apps (Android, iOS) - e.g. for Cordova. Only native webview implementations may work.&lt;br /&gt;
&lt;br /&gt;
&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;
== Review SDK Integration Architecture Diagram ==&lt;br /&gt;
&lt;br /&gt;
=== For Content Playback ===&lt;br /&gt;
&lt;br /&gt;
[[File:nlsn-sdk-achitecture-diagram-content-agf-v0.png||SDK Integration Architecture Diagram - Content]]&lt;br /&gt;
&lt;br /&gt;
=== For Ad Playback ===&lt;br /&gt;
[[File:nlsn-sdk-achitecture-diagram-agf-ad-v0.png||SDK Integration Architecture Diagram - Ad]]&lt;br /&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;
&lt;br /&gt;
/* NLSQUEUE build v*/&lt;br /&gt;
!function(e,n){&lt;br /&gt;
  function t(e){&lt;br /&gt;
    return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
  }&lt;br /&gt;
  e[n]=e[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(o,r,c){&lt;br /&gt;
      var s=e.document,&lt;br /&gt;
      a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
      a.async=1,&lt;br /&gt;
      a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.nmrodam.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
      var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
      return i.parentNode.insertBefore(a,i),&lt;br /&gt;
      e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
      ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
      trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
      e[n][r]&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 files 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(e,n){&lt;br /&gt;
		function t(e){&lt;br /&gt;
			return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
		}&lt;br /&gt;
		e[n]=e[n]||&lt;br /&gt;
		{&lt;br /&gt;
			nlsQ:function(o,r,c){&lt;br /&gt;
				var s=e.document,&lt;br /&gt;
				a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
				a.async=1,&lt;br /&gt;
				a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.nmrodam.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
				var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
				return i.parentNode.insertBefore(a,i),&lt;br /&gt;
				e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
				ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
				trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
				e[n][r]&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-994AEFB7XXXX&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. Users 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;
&lt;br /&gt;
===== Description of 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;
For detailed information on metadata and custom variables, see '''[[AGF Metadata Convention#Video Measurement|AGF Metadata Convention for Video Measurement]]'''&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;
| assetid || unique ID assigned to asset (64 character limit; only characters 0-9, a-z, A-Z underscore and minus are allowed - no special characters or vowel mutations)|| custom (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 - no backslash allowed in string (because of 3rd party data processing) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| length || length of content in seconds || &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; ('86400' for 24/7 Livestream. For Event-Livestreams planned length. For VoD video length) || ✓&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 with 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)&lt;br /&gt;
||&lt;br /&gt;
provided by Nielsen	&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| nol_c0  || number of episode part (Sendungsteilenummer)              || number                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c2  || web only                     || 'Y' or 'N'          || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c5  || page URL                     || custom                ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c7  || Video ID                     || custom                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c8  || not in use         		  || leave blank, reserved for AGF || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c9  || episode title                || custom - no backslash allowed in string (because of 3rd party data processing) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c10 || publisher                    || custom                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c12 || type of asset                || 'Trailer' or 'Content'             || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c13 || custom variable              || custom ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c14 || not in use         		  || leave blank, reserved for AGF || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c15 || format ID                    || custom                ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c16 || content-ID (Combines different videos to a common category, content-wise, a content-ID is available for content, trailer and ads) || custom, i.e. 'dVxRcCpOqKyFz02fuss', 'dvrsowf_ten_rtlibes', etc ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c18 || livestream                   || 'Y' or 'N' || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c19 || custom variable              || custom                ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c20 || GfK-ID                     || custom                ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Example Content metadata =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var content_metadata_object = {  &lt;br /&gt;
  type:     'content',&lt;br /&gt;
  assetid:  '88675545',&lt;br /&gt;
  program:  'Program Name',&lt;br /&gt;
  title:    'episode title',&lt;br /&gt;
  length:   '3600',&lt;br /&gt;
  nol_c0:  'p0,1',&lt;br /&gt;
  nol_c2:  'p2,Y',&lt;br /&gt;
  nol_c7:  'p7,videoid123',&lt;br /&gt;
  nol_c8:  'p8,',&lt;br /&gt;
  nol_c9:  'p9,VideoTitle123',&lt;br /&gt;
  nol_c10: 'p10,clientname',&lt;br /&gt;
  nol_c12: 'p12,content',&lt;br /&gt;
  nol_c18: 'p18,N'&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;
===== Description of 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;
For detailed information on metadata and custom variables, see '''[[AGF Metadata Convention#Video Measurement|AGF Metadata Convention for Video Measurement]]'''&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 asset (64 character limit; only characters 0-9, a-z, A-Z underscore and minus are allowed - no special characters or vowel mutations)|| custom (no SPACE - no [https://engineeringportal.nielsen.com/docs/Special_Characters Special Characters]) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| subbrand	|| vcid/sub-brand ID – value is automatically populated through provided App ID. In order to override the sub-brand configured to the App ID, value can be passed here (e.g. multiple sub-brands in App) || provided by Nielsen	||&lt;br /&gt;
|-&lt;br /&gt;
| title || only the AD-ID is necessary || custom, &amp;lt;AD-ID&amp;gt; without &amp;quot;VAST&amp;quot; Prefix or other, i.e.  '2352723141' ||	✓&lt;br /&gt;
|-	&lt;br /&gt;
| length || length of Ad in seconds || length of Ad in seconds || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c1 || universal AdID (Additional AD-ID to be used by second or third marketers) || custom, i.e. 'adgapid_022_800160_1601097_001_0_0' ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c2  || web only                     || 'Y' or 'N'          || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c4 || form of advertising || 'preroll','midroll', 'postroll', 'pre-split', 'sponsor' ||	&lt;br /&gt;
|-&lt;br /&gt;
| nol_c8  || not in use         		  || leave blank, reserved for AGF || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c10 || publisher                    || custom                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c11 || AD-ID (unique ID of an advertisement. Necessary if ads are being broadcasted) || custom, i.e. '2352723141' || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c12 || content type (key distinction of content, advertising, and Trailer) || 'Werbung' ||  ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c16 || content-ID (Combines different videos to a common category, content-wise, a content-ID is available for content, trailer and ads) || custom, i.e. 'dVxRcCpOqKyFz02fuss', 'dvrsowf_ten_rtlibes', etc ||	&lt;br /&gt;
|-&lt;br /&gt;
| nol_c17 || ad placement type (placement information of advertisement) || 'preroll', 'midroll', 'postroll' or 'other' ||	✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example Ad metadata =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ad_metadata_object = {  &lt;br /&gt;
  type:     'preroll',&lt;br /&gt;
  assetid:  'ad345-67483',&lt;br /&gt;
  title:    'ad_title',&lt;br /&gt;
  length:   '25',&lt;br /&gt;
  nol_c8:  'p8,',&lt;br /&gt;
  nol_c10: 'p10,clientname',&lt;br /&gt;
  nol_c11: 'p11,2352723141',&lt;br /&gt;
  nol_c12: 'p12,Werbung',&lt;br /&gt;
  nol_c17: 'p17,preroll'&lt;br /&gt;
}&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;
* '''For video content:'''&lt;br /&gt;
** Send '''loadMetadata''' with the same metadata and continue sending '''setPlayheadPosition''' once the playback resumes.&lt;br /&gt;
* '''For ads:'''&lt;br /&gt;
** just continue sending '''setPlayheadPosition''' 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 and after stop event when resuming '''video content''' (not after pausing and resuming an ad)&lt;br /&gt;
|-&lt;br /&gt;
| 'setPlayheadPosition'&lt;br /&gt;
||&lt;br /&gt;
*&amp;quot;VOD (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 on pause event (when resume will be available). 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.&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;
* '''For type 'content' ''': Sending a &amp;quot;loadMetadata&amp;quot; event after a &amp;quot;stop&amp;quot; event will be handled by the SDK as a &amp;quot;resume&amp;quot;, as long as the &amp;quot;assetid&amp;quot; and &amp;quot;type&amp;quot; are the same and not changed from the values before the &amp;quot;stop&amp;quot; event happened. Changing &amp;quot;assetid&amp;quot; value will lead into a new stream. Changing of &amp;quot;type&amp;quot; from &amp;quot;content&amp;quot; to &amp;quot;preroll&amp;quot; (&amp;quot;midroll&amp;quot;, &amp;quot;postroll&amp;quot;) will lead into a new object (ad) with that content stream. Changing any other parameter (eg. &amp;quot;program&amp;quot; or &amp;quot;title&amp;quot;) for the content will not affect the reported content data (will stay as in the very first &amp;quot;content&amp;quot; metadata)&lt;br /&gt;
&lt;br /&gt;
== Livestream ==&lt;br /&gt;
For '''Livestreams'''  please make sure playheadPosition is in UNIX-Timestamp for Content.&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
The Browser SDK measurement is working without cookies and other personal information. No user can be identified personally, therefore an opt-out functionality is not required. The Nielsen Browser SDK measurement is utilizing a cookieless domain.&lt;br /&gt;
&lt;br /&gt;
In order to disclose Nielsen measurement privacy statement, please include the following items in your privacy policy:&lt;br /&gt;
* A notice that the player includes third party measurement software that allows users to contribute to market research with anonymous data.&lt;br /&gt;
* A link to the Nielsen Digital Measurement Privacy Policy located at https://nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/?lang=de .&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-994AEFB7XXXX&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 parameters to enable data collection. Without that notification, no data will be collected, and no data will be reported.&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=NWE-TS&amp;diff=6620</id>
		<title>NWE-TS</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=NWE-TS&amp;diff=6620"/>
		<updated>2024-04-10T23:29:20Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|TV}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:TV]]&lt;br /&gt;
&lt;br /&gt;
The '''NWE-TS''' is the ideal solution for inserting Nielsen Watermarks into the audio of television programming that is carried in an ATSC Transport Stream (TS).&lt;br /&gt;
&lt;br /&gt;
Refer to [[NWE-3GA]] for more information on how to watermark uncompressed audio in SDI or AES3 signals.&lt;br /&gt;
&lt;br /&gt;
== NWE-TS Nielsen Watermarks Encoder for ATSC Transport Streams ==&lt;br /&gt;
The timestamp structured watermarks make use of the “SID” (Source Identifier), which is a serial number used by Nielsen and the television industry to uniquely identify program content, to ensure proper crediting of viewing.&lt;br /&gt;
&lt;br /&gt;
The NWE-TS accepts a DVB-ASI input, containing a 19.39 Mbps ATSC TS. It applies the watermark to up to 10 user-selected audio streams which can be 5.1-channel surround, stereo or mono. All watermarked audio streams are reinserted into the output TS with the same timing relative to the video as they had upon arrival at the NWE-TS input. It can be configured to assign different SID values to each of the selected audio streams, making it suitable for use with both single-program and Multi-Program Transport Streams (MPTS).&lt;br /&gt;
&lt;br /&gt;
The NWE-TS includes a TS delay buffer, to ensure proper audio-video synchronization. The ASI interface provides relay bypass, allowing the TS to pass transparently through the unit when power is off or when the bypass has been activated by the front-panel pushbutton.&lt;br /&gt;
&lt;br /&gt;
The timestamp included in the watermark data can be synchronized to either SMPTE 12M unbalanced LTC or network time obtained via the network connection from an NTP server.&lt;br /&gt;
&lt;br /&gt;
== NWE-TS Nielsen Watermarks Encoder for ATSC Transport Streams Flow Diagram ==&lt;br /&gt;
[[File:NWE-TS_diagram.jpg|link=]]&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
*270 MHz ASI path, with bypass relay protection&lt;br /&gt;
*Accepts any 19.39 Mbps ATSC ASI Transport Stream, including MPTS&lt;br /&gt;
*Watermarks up to 10 audio programs&lt;br /&gt;
*Transparent to PSI, PSIP, and all elementary streams except the watermarked audio streams&lt;br /&gt;
*1RU Linux-based server platform with SLC SSD (Solid State Disk) for high reliability&lt;br /&gt;
*LTC unbalanced input&lt;br /&gt;
*Dashboard control, with selectable alarming&lt;br /&gt;
*Front-panel bypass control and LED indicators for system status&lt;br /&gt;
*3-year transferable warranty&lt;br /&gt;
*Can be paired with a Ross Video ASI-310 dual converter for watermarking of a SMPTE 310 TS&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/NWE-TS/NWE_TS_User_Manual_01-02-24.pdf NWE-TS User Manual]&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/NWE-TS/NWE-TS%20Quick%20Start%20Guide%20(NWETSDR-002).pdf NWE-TS Quick Reference Guide]&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/NWE-TS/Release+Notes+for+Nielsen+NWE-TS+encoder+software+4.6.10.pdf NWE-TS Release Notes v4.6.10]&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/NWE-TS/Release%20Notes%20for%20Nielsen%20NWE-TS%20encoder%20software%204.5.1_Final_Final.pdf NWE-TS Release Notes v4.5.1]&lt;br /&gt;
*[https://nielsendownloads.digitalengsdk.com/tv/Encoding/Encoder+Policy+2022+-+04-01-22.pdf Nielsen Encoder Installation and Configuration Policy 2022]&lt;br /&gt;
&lt;br /&gt;
== Software Updates ==&lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-TS Firmware 4.6.10|dlid=31e04631784a2438fc41c81f34a49c33cd513ec6}} ''('''New!''' - June 17th, 2019)''&lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-TS Firmware 4.5.1|dlid=5126ebc2699eda28002ba6e2e84fb8a1031827f5}}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Radio_Certified_Vendors&amp;diff=6619</id>
		<title>Nielsen Radio Certified Vendors</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Radio_Certified_Vendors&amp;diff=6619"/>
		<updated>2024-04-10T23:28:07Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Radio}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Radio]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
&amp;lt;!--  --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! OEM Vendor !! Product !! Product Version !! AM !! FM !! HD !! Internet Streaming !! Domestic !! International !! Radio Encoding &lt;br /&gt;
|-&lt;br /&gt;
| '''ATC Labs''' || '''Perceptual SoundMax'''|| '''2.12''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''iHeartRadio''' || '''Sound+ EdgePlayer'''|| '''1''' || '''✔''' || '''✔''' || ''' ''' || ''' ''' || '''✔''' || ''' ''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]  &lt;br /&gt;
|-&lt;br /&gt;
| '''Orban''' || '''5500i'''|| '''4.0''' ||  || '''✔''' ||  ||  || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Orban''' || '''5700i'''|| '''3.0''' ||  || '''✔''' || '''✔''' ||  || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Orban''' || '''8600si'''|| '''3.0.0.1''' ||  || '''✔''' || '''✔''' ||  || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Orban''' || '''PCn1600'''|| '''2.0''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' ||[[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.0.7 (02-12-2020)|1.1.7]]  &lt;br /&gt;
|-&lt;br /&gt;
| '''Orban''' || '''XPN'''|| '''2.0''' || '''✔''' ||  || '''✔''' ||  || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.0.7 (02-12-2020)|1.0.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''RCS Sound Software''' || '''SoundCenter'''|| '''v0.0.1''' || '''✔''' || '''✔''' || '''✔''' || ''' ''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]  &lt;br /&gt;
|-&lt;br /&gt;
| '''Telos/Omnia''' || '''Omnia 9'''|| '''3.30.79''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telos/Omnia''' || '''Omnia 9s'''|| '''3.30.61''' ||  || '''✔''' || '''✔''' || ''' ''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| '''Telos/Omnia''' || '''ZIP/stream X/2'''|| '''1.25.07''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telos/Omnia''' || '''ZIP/stream R/2'''|| '''1.09.04''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Telos/Omnia''' || '''ZIP/stream X/20'''|| '''2.1.3''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telos/Omnia''' || '''ZIP/stream R/20'''|| '''2.1.4''' ||  ||  || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Thimeo''' || '''Stereo Tool- Enterprise'''|| '''10.0''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (07-25-22)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Thimeo''' || '''STXtreme (Hardware Processor)'''|| '''10.1''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || '''✔''' || [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (12-22-22)|1.1.7]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Wheatstone''' || '''Layers Stream Core'''|| '''1.0.1.0''' ||  ||  ||  || '''✔''' || '''✔''' || '''✔''' ||  [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Wheatstone''' || '''Streamblade'''|| '''1.0.2''' ||  ||  ||  || '''✔''' || '''✔''' || '''✔''' ||  [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Wheatstone''' || '''Wheatstream'''|| '''1.0.2''' ||  ||  ||  || '''✔''' || '''✔''' || '''✔''' ||  [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.7 (10-27-2020)|1.1.7]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Wheatstone''' || '''X5'''|| '''1.3.0''' ||  || '''✔''' || '''✔''' ||  || '''✔''' || '''✔''' ||  [[Watermark Radio SDK Release Notes#Watermark Radio SDK v1.1.5 (02-12-2020)|1.1.5]] &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_iOS_Cocoapods_Guide&amp;diff=6618</id>
		<title>Digital Measurement iOS Cocoapods Guide</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_iOS_Cocoapods_Guide&amp;diff=6618"/>
		<updated>2024-04-10T23:24:55Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|Digital Downloads}} {{Breadcrumb|Digital Measurement iOS Artifactory Guide}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
= How to install Nielsen SDK using CocoaPods =&lt;br /&gt;
CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over 30 thousand libraries and is used in over 1.9 million apps. The Nielsen SDK now uses this distribution framework for improved version management and provides a Static and Dynamic Framework.&lt;br /&gt;
&lt;br /&gt;
== Initial Configuration ==&lt;br /&gt;
The Nielsen SDK integration requires Cocoapods.  &lt;br /&gt;
* The XCFramework which requires Cocoapods Version 1.10.1 or higher.&lt;br /&gt;
* The Dynamic Framework which requires Cocoapods Version 1.6.1 or higher.&lt;br /&gt;
* The Static Framework requires Cocoapods version 1.4.0. or higher.&lt;br /&gt;
&lt;br /&gt;
The full installation guide for this framework is provided on the [https://guides.cocoapods.org/using/getting-started.html Getting Started] page, and how to set up the Podfile is mentioned in [https://guides.cocoapods.org/using/using-cocoapods.html Using Cocoapods] page.&lt;br /&gt;
&lt;br /&gt;
== Repository Credentials ==&lt;br /&gt;
The first step is to add the credentials received from Nielsen into your .netrc file.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[Image:AlertIcon.png|left|60px|link=|class=smallIcon]] Starting on Sept 21, 2021 the Nielsen SDK has moved to a public repository. Credentials are no longer required.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verify version of Cocoapods ==&lt;br /&gt;
First verify that Cocoapods is installed.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If it is not, then install.&amp;lt;br &amp;gt;&lt;br /&gt;
===== Install via gem =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
sudo gem install cocoapods&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Install using homebrew ===== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
brew install cocoapods&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Add Cocoapod repository ==&lt;br /&gt;
=== XCFramework (Cocoapods 1.10.1+) ===&lt;br /&gt;
If using '''XCFramework''' (preferred approach), from the command line, type the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod repo add NielsenAppSDK https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs-dynamic.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Make sure you run the pod init command in your **project's directory.**&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod init&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;You now need to slightly modify the PodFile that was created in this directory.  From the command line, you can use vi or vim to edit. &amp;lt;br&amp;gt; The following must be in the PodFile:&lt;br /&gt;
==== Podfile ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
platform :ios, '14.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs-dynamic.git'&lt;br /&gt;
source 'https://github.com/CocoaPods/Specs.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
 use_frameworks!&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK-XC'&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you migrate from the iOS dynamic framework to the XCFramework, just add -XC suffix for the pod in the podfile. E.g. NielsenAppSDK should be replaced with NielsenAppSDK-XC. The same Github repo is used for both dynamic and XCFramework.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Although official CocoaPods source is implicit but once you specify NielsenAppSDK source, then CocoaPods source will need to be included in PodFile if you are using some other third party pods along with NielsenAppSDK. Further details are mentioned here https://guides.cocoapods.org/syntax/podfile.html#source&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note on TVOS''': Nielsen AppSDK clients with applications on TVOS platform should take into account that TVOS slices are now part of the same XCFramework with iOS slices, so the XCFramework name is the same for both iOS and TVOS. But the TVOS framework imported in the application still has TVOS in its name. This is needed to reduce the number of changes in the existing apps. The code below should be added into the podfiles for TVOS XCFramework users:&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
# modify XCFramework configuration files to update NielsenAppApi.framework -&amp;gt; NielsenTVAppApi.framework&lt;br /&gt;
post_install do |installer|&lt;br /&gt;
  installer.pods_project.targets.each do |target|&lt;br /&gt;
    if target.name == 'Pods-NielsenVideoPlayerTVOSPodsXC'&lt;br /&gt;
      # update Pods-NielsenVideoPlayerTVOSPodsXC.debug.xcconfig file&lt;br /&gt;
      # update Pods-NielsenVideoPlayerTVOSPodsXC.release.xcconfig file&lt;br /&gt;
      target.build_configurations.each do |config|&lt;br /&gt;
          xcconfig_path = config.base_configuration_reference.real_path&lt;br /&gt;
          puts &amp;quot;post_install: Found #{File.basename(xcconfig_path)}&amp;quot;&lt;br /&gt;
          xcconfig = File.read(xcconfig_path)&lt;br /&gt;
          new_xcconfig = xcconfig.sub('-framework &amp;quot;NielsenAppApi&amp;quot;', '-framework &amp;quot;NielsenTVAppApi&amp;quot;')&lt;br /&gt;
          File.open(xcconfig_path, &amp;quot;w&amp;quot;) { |file| file &amp;lt;&amp;lt; new_xcconfig }&lt;br /&gt;
          puts &amp;quot;post_install: Updated #{File.basename(xcconfig_path)} file with a value: NielsenTVAppApi.framework&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      # update Pods-NielsenVideoPlayerTVOSPodsXC-frameworks.sh file&lt;br /&gt;
      frameworksh_path = &amp;quot;Pods/Target Support Files/#{target.name}/#{target.name}-frameworks.sh&amp;quot;&lt;br /&gt;
      if File.exist?(frameworksh_path)&lt;br /&gt;
        puts &amp;quot;post_install: Found #{File.basename(frameworksh_path)}&amp;quot;&lt;br /&gt;
        text = File.read(frameworksh_path)&lt;br /&gt;
        new_contents = text.gsub('NielsenAppApi.framework', 'NielsenTVAppApi.framework')&lt;br /&gt;
        File.open(frameworksh_path, &amp;quot;w&amp;quot;) {|file| file.puts new_contents}&lt;br /&gt;
        puts &amp;quot;post_install: Updated #{File.basename(frameworksh_path)} file with a value: NielsenTVAppApi.framework&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If you migrate from the TVOS dynamic framework to the XCFramework, please note that TVOS slices are now part of the same XCFramework with iOS slices. So in addition to appending of the -XC suffix to the pod name in the podfile please remove TVOS. E.g. the naming for the pod NielsenTVOSAppSDK should be changed to NielsenAppSDK-XC.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Framework (Cocoapods 1.6.1+) ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': We highly recommend to migrate to XCFramework for all our clients.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
If using '''Dynamic Framework''', from the command line, type the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod repo add NielsenAppSDK https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs-dynamic.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Make sure you run the pod init command in your **project's directory.**&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod init&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;You now need to slightly modify the PodFile that was created in this directory.  From the command line, you can use vi or vim to edit. &amp;lt;br&amp;gt; The following must be in the PodFile:&lt;br /&gt;
==== Podfile ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
platform :ios, '11.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs-dynamic.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
 use_frameworks!&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you are building an application on a Mac with Apple M1 chip, please add the following fix to end of the podfile&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
post_install do |installer|&lt;br /&gt;
  installer.pods_project.build_configurations.each do |config|&lt;br /&gt;
    config.build_settings[&amp;quot;EXCLUDED_ARCHS[sdk=iphonesimulator*]&amp;quot;] = &amp;quot;arm64&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== For Static Framework (Cocoapods 1.4+) ===&lt;br /&gt;
From the command line, type the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod repo add NielsenAppSDK https://github.com/nielsendigitalsdk/nielsenappsdk-ios-specs.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Make sure you run the pod init command in your **project's directory.**&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod init&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;You now need to slightly modify the PodFile that was created in this directory.  From the command line, you can use vi or vim to edit. &amp;lt;br&amp;gt; The following must be in the PodFile:&lt;br /&gt;
==== Podfile ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
platform :ios, '11.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you are building an application on a Mac with Apple M1 chip, please add the following fix to end of the podfile&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
post_install do |installer|&lt;br /&gt;
  installer.pods_project.build_configurations.each do |config|&lt;br /&gt;
    config.build_settings[&amp;quot;EXCLUDED_ARCHS[sdk=iphonesimulator*]&amp;quot;] = &amp;quot;arm64&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''NOTE: You can have multiple pods within the Podfile''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
To select a specific version of the Nielsen SDK, just append the build number.  For example, this line is requesting XCFramework build 8.1.0.0:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
pod 'NielsenAppSDK-XC','8.1.0.0'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If using version control, a warning message will be displayed within the console trace during the build of your app,&lt;br /&gt;
and it will show all sdk versions released to-date, allowing a developer to select a more recent build if desired.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== For Cocoapods Versions &amp;lt; 1.6.0 ===&lt;br /&gt;
&lt;br /&gt;
If you are using a version of Cocoapods that is less than 1.6.0, you have a Swift Project and your pod has '''use_frameworks!''' please use the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
# Uncomment the next line to define a global platform for your project&lt;br /&gt;
platform :ios, '8.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks&lt;br /&gt;
use_frameworks!&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
&lt;br /&gt;
static_frameworks = ['NielsenAppSDK']&lt;br /&gt;
# make all the other frameworks into static frameworks by overriding the static_framework? function to return true&lt;br /&gt;
pre_install do |installer|&lt;br /&gt;
    installer.pod_targets.each do |pod|&lt;br /&gt;
        if static_frameworks.include?(pod.name)&lt;br /&gt;
            puts &amp;quot;Overriding the static_framework? method for #{pod.name}&amp;quot;&lt;br /&gt;
            def pod.static_framework?;&lt;br /&gt;
            true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PODFILE NOTE for Developers with Apple Silicon-Based Macs Using Dynamic/Static Frameworks==&lt;br /&gt;
If you are building your iOS application on a Mac with Apple Silicon chip (M1/M2, etc), please add the following fix to end of the podfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
post_install do |installer|&lt;br /&gt;
  installer.pods_project.build_configurations.each do |config|&lt;br /&gt;
    config.build_settings[&amp;quot;EXCLUDED_ARCHS[sdk=iphonesimulator*]&amp;quot;] = &amp;quot;arm64&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you encounter the below error after making above changes...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ld: framework not found Pods_&amp;lt;/br&amp;gt;&lt;br /&gt;
clang: error: linker command failed with exit code 1 (use -v to see invocation)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
...you must exclude arm64 simulator architecture from your project - navigate to &amp;quot;Build Settings&amp;quot; of your project and add &amp;quot;Any iOS Simulator SDK&amp;quot; with value arm64 inside &amp;quot;Excluded Architecture&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Cocoa XC15.png|1000px|center]]&lt;br /&gt;
&lt;br /&gt;
== Execute Install ==&lt;br /&gt;
Once that has been edited, you can now execute the install:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
pod install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Cocoapods will automatically create a new file with extension “.xcworkspace”. From this moment, that file should be used for using the target project instead of previous one with extension “.xcodeproj”. Inside of this workspace you will see “Pods” target which will include ready to use NielsenAppApi framework.&lt;br /&gt;
&lt;br /&gt;
Open the file with the extension of &amp;lt;code&amp;gt;.xcworkspace&amp;lt;/code&amp;gt; file using Xcode.&lt;br /&gt;
&lt;br /&gt;
== Execute Update ==&lt;br /&gt;
When you want to retrieve latest Nielsen SDK version then please use pod update [Nielsen App Flavor Name]:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
pod update NielsenAppSDK-XC&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case if you set specific version of the Nielsen SDK in your PodFile then you'll also need to update that specific version to latest version in your PodFile before executing pod update command:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
pod 'NielsenAppSDK-XC','9.0.0.0'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Build Notes ==&lt;br /&gt;
Please note that the Nielsen dynamic framework contains slices for devices and simulators.  When building your project it is recommended that Simulator slices are removed before sending the app to the AppStore.   An example of the shell script that should be added as a Run Script phase in the application is attached&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
APP_PATH=&amp;quot;${TARGET_BUILD_DIR}/${WRAPPER_NAME}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# This script loops through the frameworks embedded in the application and&lt;br /&gt;
# removes unused architectures.&lt;br /&gt;
find &amp;quot;$APP_PATH&amp;quot; -name '*.framework' -type d | while read -r FRAMEWORK&lt;br /&gt;
do&lt;br /&gt;
FRAMEWORK_EXECUTABLE_NAME=$(defaults read &amp;quot;$FRAMEWORK/Info.plist&amp;quot; CFBundleExecutable)&lt;br /&gt;
FRAMEWORK_EXECUTABLE_PATH=&amp;quot;$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME&amp;quot;&lt;br /&gt;
echo &amp;quot;Executable is $FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
EXTRACTED_ARCHS=()&lt;br /&gt;
&lt;br /&gt;
for ARCH in $ARCHS&lt;br /&gt;
do&lt;br /&gt;
echo &amp;quot;Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME&amp;quot;&lt;br /&gt;
lipo -extract &amp;quot;$ARCH&amp;quot; &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot; -o &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-$ARCH&amp;quot;&lt;br /&gt;
EXTRACTED_ARCHS+=(&amp;quot;$FRAMEWORK_EXECUTABLE_PATH-$ARCH&amp;quot;)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Merging extracted architectures: ${ARCHS}&amp;quot;&lt;br /&gt;
lipo -o &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-merged&amp;quot; -create &amp;quot;${EXTRACTED_ARCHS[@]}&amp;quot;&lt;br /&gt;
rm &amp;quot;${EXTRACTED_ARCHS[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Replacing original executable with thinned version&amp;quot;&lt;br /&gt;
rm &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
mv &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-merged&amp;quot; &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pod Versions ==&lt;br /&gt;
The following Pod versions are now available: (For 'kids' apps, please use the NoId framework (EG: NielsenNoIdAppSDK-XC).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Nielsen SDK builds for tvOS are no longer distributed as separated packages. XCFramework allows to combine iOS and tvOS platforms in a single package. Please use the corresponding XCFramework while migrating from static or dynamic framework for tvOS. E.g. NielsenTVOSAppSDK -&amp;gt; NielsenAppSDK-XC.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 30%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#efefef;&amp;quot;&lt;br /&gt;
! App Flavor Name&lt;br /&gt;
|-&lt;br /&gt;
| NielsenAppSDK-XC&lt;br /&gt;
|-&lt;br /&gt;
| NielsenNoAdAppSDK-XC&lt;br /&gt;
|-&lt;br /&gt;
| NielsenNoIdAppSDK-XC&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We highly recommend to migrate to XCFramework for all our clients. For clients who still have reasons to keep using the old framework packages in the application and do not migrate to XCFramework we distribute &amp;quot;fat&amp;quot; frameworks both static and dynamic for the release 8.1.0.0. Anyway, our plan to stop distributing &amp;quot;fat&amp;quot; frameworks for future releases and to distribute the Nielsen iOS SDK as an XCFramework only.&lt;br /&gt;
&lt;br /&gt;
The following Pod versions are available: (For 'kids' apps, please use the NoId framework (EG: NielsenNoIdAppSDK, NielsenNoIdTVOSAppSDK) &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 30%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#efefef;&amp;quot;&lt;br /&gt;
! App Flavor Name&lt;br /&gt;
|-&lt;br /&gt;
| NielsenAppSDK&lt;br /&gt;
|-&lt;br /&gt;
| NielsenNoAdAppSDK&lt;br /&gt;
|-&lt;br /&gt;
| NielsenNoAdTVOSAppSDK&lt;br /&gt;
|-&lt;br /&gt;
| NielsenNoIdAppSDK &lt;br /&gt;
|-&lt;br /&gt;
| NielsenNoIdTVOSAppSDK &lt;br /&gt;
|-&lt;br /&gt;
| NielsenTVOSAppSDK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Regional Builds ===&lt;br /&gt;
(For 'kids' apps, please use the NoId framework (EG: NielsenAGFNoIdAppSDK-XC, NielsenAGFNoIdTVOSAppSDK-XC) &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 30%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#efefef;&amp;quot;&lt;br /&gt;
! App Flavor Name&lt;br /&gt;
|-&lt;br /&gt;
| NielsenAGFAppSDK-XC&lt;br /&gt;
|-&lt;br /&gt;
| NielsenAGFNoAdAppSDK-XC&lt;br /&gt;
|-&lt;br /&gt;
| NielsenAGFNoIdAppSDK-XC&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Fat frameworks are still available for the release 8.1.0.0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 30%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#efefef;&amp;quot;&lt;br /&gt;
! App Flavor Name&lt;br /&gt;
|-&lt;br /&gt;
| NielsenAGFAppSDK&lt;br /&gt;
|-&lt;br /&gt;
| NielsenAGFNoAdAppSDK&lt;br /&gt;
|-&lt;br /&gt;
| NielsenAGFNoAdTVOSAppSDK&lt;br /&gt;
|-&lt;br /&gt;
| NielsenAGFNoIdAppSDK&lt;br /&gt;
|-&lt;br /&gt;
| NielsenAGFNoIdTVOSAppSDK&lt;br /&gt;
|-&lt;br /&gt;
| NielsenAGFTVOSAppSDK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Appsdk Suffix Reference ===&lt;br /&gt;
The Nielsen AppSDK has various configurations per market and distribution type, which can be determined by reviewing the [[Digital Measurement iOS Suffix Guide|sdk suffix]].  The first part will be the SDK version: 3 digits for the major SDK version and 1 digit for the minor SDK version. EG: &amp;lt;code&amp;gt;ai.8.1.0.0_abc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pod Cache Cleanup  ===&lt;br /&gt;
If you find any trouble while installing or updating latest Nielsen SDK version then you may need to clean up the pod cache by executing following commands:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
rm -rf ~/Library/Caches/CocoaPods&lt;br /&gt;
rm -rf Pods&lt;br /&gt;
rm -rf ~/Library/Developer/Xcode/DerivedData/*&lt;br /&gt;
pod deintegrate&lt;br /&gt;
pod setup&lt;br /&gt;
pod install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xcode 14 Bitcode Changes ===&lt;br /&gt;
Starting from Xcode 14, bitcode is no longer required for iOS, watchOS and tvOS applications, and the App Store no longer accepts bitcode submissions from Xcode 14. So if bitcode is enabled to Yes then following error may come while integrating through Cocoapods:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Xcode setting ENABLE_BITCODE: obtain an updated library from the vendor, or disable bitcode for this target&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
To Fix:&lt;br /&gt;
Target -&amp;gt; Build Settings -&amp;gt; Build Options -&amp;gt; set Enable Bitcode to No. &lt;br /&gt;
&lt;br /&gt;
[[File:NielsenSamplePlayer.png|1000px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Resources ===&lt;br /&gt;
&lt;br /&gt;
For more information on [https://guides.cocoapods.org/using/getting-started.html CocoaPods] or How to set up the Profile in the [https://guides.cocoapods.org/using/using-cocoapods.html Using Cocoapods] page.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=File:Cocoa_XC15.png&amp;diff=6617</id>
		<title>File:Cocoa XC15.png</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=File:Cocoa_XC15.png&amp;diff=6617"/>
		<updated>2024-04-10T23:24:02Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Cocoa/X15 image&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Cocoa/X15 image&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=iOS_SDK_Upgrade&amp;diff=6616</id>
		<title>iOS SDK Upgrade</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=iOS_SDK_Upgrade&amp;diff=6616"/>
		<updated>2024-04-10T23:23:20Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= How to install the Nielsen App SDK using Cocoapods =&lt;br /&gt;
CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over 30 thousand libraries and is used in over 1.9 million apps. The Nielsen SDK now uses this distribution framework for improved version management and provides a Static and Dynamic Framework. Please see [[Digital_Measurement_iOS_Cocoapods_Guide]] for instructions.&lt;br /&gt;
&lt;br /&gt;
=== Appsdk Suffix Reference ===&lt;br /&gt;
The Nielsen AppSDK has various configurations per market and distribution type, which can be determined by reviewing the [[Digital Measurement iOS Suffix Guide|sdk suffix]].  The first part will be the SDK version: 3 digits for the major SDK version and 1 digit for the minor SDK version. EG: &amp;lt;code&amp;gt;ai.8.1.0.0_abc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Additional Resources ===&lt;br /&gt;
&lt;br /&gt;
For more information on [https://guides.cocoapods.org/using/getting-started.html) CocoaPods] or How to set up the Profile in the [https://guides.cocoapods.org/using/using-cocoapods.html) Using Cocoapods] page.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=NWE-3GA&amp;diff=6615</id>
		<title>NWE-3GA</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=NWE-3GA&amp;diff=6615"/>
		<updated>2024-04-10T23:21:27Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|TV}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:TV]]&lt;br /&gt;
&lt;br /&gt;
The '''NWE-3GA''' is the ideal solution for inserting Nielsen Watermarks into the audio for television programming. The timestamp structured watermarks make use of the “SID” (Source Identifier), which is a serial number used by Nielsen and the television industry to uniquely identify program content, to ensure proper crediting of viewing.&lt;br /&gt;
&lt;br /&gt;
The NWE-3GA accepts an SDI input (3 Gb/s, 1.5 Gb/s, or 270 Mb/s) and 4 AES3 digital audio inputs. It applies the watermark to up to 16 PCM audio channels selected from the 16 embedded and 8 AES channels. Embedded audio signals that are watermarked are re-embedded into the same location in the SDI output. AES audio signals that are watermarked are re-encoded into the same AES output.&lt;br /&gt;
&lt;br /&gt;
The module can be configured to support a variety of audio configurations, from a single stereo pair up to two 5.1 surround groups and two stereo pairs. The NWE-3GA includes a video frame delay to ensure proper audio-video synchronization. The rear connector module provides relay bypass of the video and AES signals, allowing the NWE-3GA module to be inserted or extracted without interrupting the program path.&lt;br /&gt;
&lt;br /&gt;
The timestamp included in the watermark data can be synchronized to either SMPTE 12M LTC (both balanced and unbalanced inputs are provided) or network time obtained by the frame from an NTP server.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Watermarks NWE – 3GA Encoder Flow Diagram ==&lt;br /&gt;
[[File:NWE-3GA diagram.jpg|link=]]&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
*3GHz video path with bypass relay protection Handles all popular SD and HD video formats, up to 1080p/59.97&lt;br /&gt;
*4 AES3 paths with bypass relay protection&lt;br /&gt;
*Transparent to VANC and HVANC data&lt;br /&gt;
*Both video and audio are delayed by one video frame time (two frames for 59.97Hz progressive formats)&lt;br /&gt;
*Up to 5 NWE-3GA modules can be installed in a single 2RU frame; alternatively, 1 NWE-3GA can be installed with up to 16 other cards&lt;br /&gt;
*RS232 port for external / automation control and monitoring&lt;br /&gt;
*Dashboard control with selectable alarming on video, audio and time inputs&lt;br /&gt;
*5-year transferable warranty&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/NWE-3GA/NWE_3GA.pdf NWE-3GA User Manual]&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/NWE-3GA/QuickStart%20NWE-3GA%20(NWE3AGDR-002).pdf NWE-3GA QuickStart Guide]&lt;br /&gt;
*[https://nielsendownloads.digitalengsdk.com/tv/Encoding/NWE-3GA/Release+Notes+for+Nielsen+NWE-3GA+encoder+software+v2.5.pdf NWE-3GA Release Notes v2.5.0.0]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/NWE-3GA/Release%20Notes%20for%20Nielsen%20NWE-3GA%20encoder%20software%202.3.0.9.pdf NWE-3GA Release Notes v2.3.0.9]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
*[https://nielsendownloads.digitalengsdk.com/tv/Encoding/Encoder+Policy+2022+-+04-01-22.pdf Nielsen Encoder Installation and Configuration Policy 2022]&lt;br /&gt;
&lt;br /&gt;
== Software Updates ==&lt;br /&gt;
&lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-3GA Software package Rev 2.5.0.0 |dlid= 5a3f0ecbef6bfe4c9339fb8346a0064a645ebebf}} &amp;lt;small&amp;gt;''('''New!''' - Nov. 27, 2023)''&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-3GA NWE-3G Software package Rev 2.3.0.9 |dlid=73aeefb5972bb1f556aa5093c14b981d223bec8e}}&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Audio_Code_Analysis_Tool_2%3Faction%3Dedit&amp;diff=6614</id>
		<title>Nielsen Audio Code Analysis Tool 2?action=edit</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Audio_Code_Analysis_Tool_2%3Faction%3Dedit&amp;diff=6614"/>
		<updated>2024-04-10T23:19:53Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Radio]]&lt;br /&gt;
{{Breadcrumb|}} {{Breadcrumb|Radio}} {{CurrentBreadcrumb}}&lt;br /&gt;
&lt;br /&gt;
'''Nielsen Audio Code Analysis Tool 2 (NACAT2)'''— is a software that captures audio, decodes Nielsen audio codes, logs and displays the information to the user. The Nielsen EVS department uses the NACAT application for monitoring, assisting in troubleshooting and verifying NAVE encoder installations. The primary information that is decoded by NACAT are program content (PC), final distributor (FD), time stamp, encoded channel (left or right), source identification number (SID), type of encoding (commercial or non-commercial) and DST or standard time.&lt;br /&gt;
&lt;br /&gt;
== Software Downloads ==&lt;br /&gt;
{{TVDownloadRequestLink|name=NACAT2 1.4|dlid=83d58832e663a21841b32f771cc2781ae5b5b572&amp;amp;section=r}}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Retrieving_ID3_Tags&amp;diff=6613</id>
		<title>Retrieving ID3 Tags</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Retrieving_ID3_Tags&amp;diff=6613"/>
		<updated>2024-04-10T23:17:00Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Audio_Code_Analysis_Tool_3&amp;diff=6612</id>
		<title>Nielsen Audio Code Analysis Tool 3</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Audio_Code_Analysis_Tool_3&amp;diff=6612"/>
		<updated>2024-04-10T23:16:00Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Radio]]&lt;br /&gt;
{{Breadcrumb|}} {{Breadcrumb|Radio}} {{CurrentBreadcrumb}}&lt;br /&gt;
&lt;br /&gt;
''' NACAT3® — Nielsen Audio Code Analysis Tool''' — The Nielsen Company has developed NACAT, a Microsoft® Windows 10/11 operating system (64-bit) PC tool to aid in diagnosing audio watermarks embedded in an audio stream.&lt;br /&gt;
&lt;br /&gt;
NACAT is a Graphical User Interface (GUI) application that captures audio, extracts Nielsen codes from that audio, decodes Nielsen audio codes (including UCC), and reports the extracted audio codes.&lt;br /&gt;
The Nielsen EVS department uses the NACAT application for monitoring, assisting in troubleshooting, and verifying NAVE encoder installations.&lt;br /&gt;
&lt;br /&gt;
'''This release has significant enhancements.'''&lt;br /&gt;
&lt;br /&gt;
This version incorporates Decoder SDK v6.0.16 with its underlying UCC/Commercial Codes and sub-minute capabilities.&lt;br /&gt;
&lt;br /&gt;
Enhancements include decode, display, and log both the left and right channels simultaneously for more complete monitoring. NACAT3® enables decoding of all 6 channels.&lt;br /&gt;
&lt;br /&gt;
NACAT 3 for Radio requires the use of a code mapping file (SIDMAP). To request a SIDMAP file that contains the mapping for your station/station groups audio codes, please email encoding@nielsen.com. You will need to provide the list of station call letters or station ownership for the codes you’re requesting.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
*[https://nielsendownloads.digitalengsdk.com/radio/Diagnostic+Tools/NACAT3%C2%AE+%E2%80%94+Nielsen+Audio+Code+Analysis+Tool.pdf NACAT3® Product Overview]&lt;br /&gt;
&lt;br /&gt;
== Software Downloads ==&lt;br /&gt;
{{TVDownloadRequestLink|name=NACAT3 3.0.0.1|dlid=4cbdb82cd444407a755ad64428e4f96f9b37d05c&amp;amp;section=r}}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=TizenTv_Debugging&amp;diff=6611</id>
		<title>TizenTv Debugging</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=TizenTv_Debugging&amp;diff=6611"/>
		<updated>2024-04-10T23:04:58Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&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;
__NOTOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The following document highlights the required configurations in order to run the Browser SDK(BSDK) on Samsung TV devices.&lt;br /&gt;
Please refer to the initial setup [[TizenTv|document]] prior to performing the following steps.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Setup Target Device ==&lt;br /&gt;
&lt;br /&gt;
Follow the steps listed [https://docs.tizen.org/application/web/get-started/tv/first-samsung-tv-app/#run-on-a-target-device here] to connect the TV target device to the computer running Tizen Studio.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Run and Debug App ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;Right click on the project &amp;gt; Debug As &amp;gt; Tizen Web Application&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Samsung tizen debug.png||600px|center|]]&lt;br /&gt;
&lt;br /&gt;
This should open the application on the Target Device and Chrome Debug Tools on the computer.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Add Browser SDK(BSDK) URLs to Access List ==&lt;br /&gt;
In the debug console you should see the following error when trying to load to the BSDK configuration file in the application:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;Failed to load resource: net::ERR_UNKOWN_URL_SCHEME&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In order to resolve this error you will have to allow access to files across the internet. Open the &amp;lt;syntaxhighlight&amp;gt;config.xml&amp;lt;/syntaxhighlight&amp;gt; file &amp;gt; Navigate to the Policy tab &amp;gt; Add the following URLs to the Access table&lt;br /&gt;
[[File:Samsung tizen debug 2.png||600px|center|]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The only limitation that we currently see is for NUID requests as the subdomain is randomly generated and Tizen doesn't allow the use of wildcards in URLs, e.g., https://*.nuid.imrworldwide.com. Also, you may have SDK measurement pings going out to a different location than secure-dcr, make sure to update according to client sfcode.&lt;br /&gt;
&lt;br /&gt;
To bypass this limitation Tizen does allow a single wildcard entry &amp;quot;*&amp;quot; in the Access list, however this is not secure for production applications.&lt;br /&gt;
&lt;br /&gt;
==Step 4: Run and Debug App==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Right click on the project &amp;gt; Debug As &amp;gt; Tizen Web Application&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[File:Samsung tizen debug 3.png||600px|center|]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You should now see the BSDK initialization logs in the console and content measurement during video playback.&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=File:Samsung_tizen_debug_3.png&amp;diff=6610</id>
		<title>File:Samsung tizen debug 3.png</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=File:Samsung_tizen_debug_3.png&amp;diff=6610"/>
		<updated>2024-04-10T23:04:03Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: tizen debug screen 3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
tizen debug screen 3&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=File:Samsung_tizen_debug_2.png&amp;diff=6609</id>
		<title>File:Samsung tizen debug 2.png</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=File:Samsung_tizen_debug_2.png&amp;diff=6609"/>
		<updated>2024-04-10T23:03:42Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: tizen debug screen 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
tizen debug screen 2&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=File:Samsung_tizen_debug.png&amp;diff=6608</id>
		<title>File:Samsung tizen debug.png</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=File:Samsung_tizen_debug.png&amp;diff=6608"/>
		<updated>2024-04-10T23:02:45Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: debug screen 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
debug screen 1&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=File:Tizen_1_Step5.png&amp;diff=6607</id>
		<title>File:Tizen 1 Step5.png</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=File:Tizen_1_Step5.png&amp;diff=6607"/>
		<updated>2024-04-10T23:02:10Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: tizen step 5&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
tizen step 5&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=File:Tizen_1_Step4.png&amp;diff=6606</id>
		<title>File:Tizen 1 Step4.png</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=File:Tizen_1_Step4.png&amp;diff=6606"/>
		<updated>2024-04-10T22:59:58Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: tizen step 4&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
tizen step 4&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Encoder_Certified_Vendors&amp;diff=6605</id>
		<title>Nielsen Encoder Certified Vendors</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Encoder_Certified_Vendors&amp;diff=6605"/>
		<updated>2024-04-10T22:57:51Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|TV}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:TV]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
&amp;lt;!--  --&amp;gt;&lt;br /&gt;
(Linear WM SDK v5.3.4 and v6.0.17 – TV CBET v2 Compliant)&lt;br /&gt;
|-&lt;br /&gt;
! OEM Vendor !! Product !! Product Version !! Numeris Capable !! Numeris Certified !! Linear WM !! VOD in TV Ratings Flag !! VOD Content Ratings !! Commercial&lt;br /&gt;
|-&lt;br /&gt;
| '''Ateme''' || '''TITAN Live'''|| '''4.1''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Amagi''' || '''Cloudport'''|| '''4.x''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''Live''' || '''2.11''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''Live''' || '''2.21.2.0''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''MediaConvert''' || '''1.0''' ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.2.1 (05-08-2020)|5.2.1]] ||&lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''MediaLive''' || '''2.18''' ||'''✔'''|| '''In Process''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (10-26-2021)|5.3.4]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''BCNEXXT''' || '''VIPE''' || '''22.10''' ||'''✔'''|| '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''Cinegy''' || '''Cinegy Air''' || '''11.3''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Clearleap/IBM''' || '''Clearflow''' || '''7.6''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Clearleap/IBM''' || '''Video Logistics Manager''' || '''27''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.0.23 (11-04-2019)|5.0.23]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''coralbay.tv''' || '''coralPlay''' || '''1''' ||'''✔'''|| ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''Dalet''' || '''Amberfin''' || '''11.5.3.0''' ||  ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] &lt;br /&gt;
|-&lt;br /&gt;
| '''encoding.com''' || '''SaaS Cloud Media''' || '''n/a''' ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Evertz''' || '''OvertureRT RenderX''' || '''2.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] || [[Watermark SDK Release Notes#Watermark SDK v4.1.1 (05-19-2017)|4.1.1]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Grass Valley''' || '''AMPP Microservices''' || '''S/W v6 (Windows)''' || ''' ''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Grass Valley''' || '''AMPP Microservices''' || '''GV Engine v3.3 (Windows)''' || ''' ''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Grass Valley''' || '''AMPP Microservices''' || '''GV Engine v3.3 (Linux)''' || ''' ''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||   &lt;br /&gt;
|- &lt;br /&gt;
| '''Grass Valley (Snell)''' || '''ICE''' || '''8.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|- &lt;br /&gt;
| '''Grass Valley''' || '''Miranda iTX OS2''' || '''3.212.0.190''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''Rhozet Carbon Coder''' || '''3.3''' ||  ||  ||  ||  ||   || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''Electra X''' || '''1.4''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''VOS''' || '''1.5''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''VOS''' || '''1.6''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4 &amp;amp; 6.0.1 (immersive)]] ||  [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''XOS''' || '''1.6''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4 &amp;amp; 6.0.1 (immersive)]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Hybrik''' || '''Cloud Media Processing''' || '''1.1''' ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] || &lt;br /&gt;
|-&lt;br /&gt;
| '''Igolgi Inc.''' || '''iLux Broadcast ATSC 1.0''' || '''2.5''' || '''✔''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Imagine Communications''' || '''Aviator Windows AWS and On Premise''' || '''4.8''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (09-26-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Imagine Communications''' || '''Versio Platform''' || '''4.5''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Inetsat''' || '''Video Server''' || '''3''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Linear Acoustic''' || '''Aero''' || '''.100, .2000, .8000''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Linear Acoustic''' || '''LA-5300''' || '''Broadcast Audio Processor''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''Aquila''' || '''5''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''Aquila''' || '''6''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''Aquila''' || '''7''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''MediaKind Encoding Live''' || '''12''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Multiplex Cloud''' || '''NEO''' || '''Ethernet Encoder Module''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Multiplex Cloud''' || '''NEO''' || '''2.10.31''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Dolphin''' || '''1.19''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.1.0.2''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.2.0.6''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.3.0.4''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.3.0.1010''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.4.0''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.5.0''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.6.0''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''PixelPower''' || '''StreamMaster DELIVER''' || '''2''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (09-22-2021)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''PixelTools''' || '''MPEGRepair HD''' || '''7.2''' ||  ||  ||   ||  || || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] &lt;br /&gt;
|-&lt;br /&gt;
| '''PixelTools''' || '''MPEGRepair HD''' || '''9.1''' ||  ||  ||   ||  || || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (11-30-2022)|6.0.13]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Ross''' || '''BAP''' || '''1.1.1''' || '''✔''' ||'''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Ross''' || '''NWE-IP''' || '''1.4.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Stingray Digital Group''' || '''Ubiquicast''' || '''4.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''Synamedia''' || '''vDCM''' || '''20''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Syncbak''' || '''Syncbox''' || '''1.0''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Telestream''' || '''Vantage''' || '''7.0''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]]  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telestream''' || '''Vantage''' || '''8.1''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.23 (06-24-22)|5.3.23]] ||[[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]]  || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telestream''' || '''Transform''' || '''2021-09-001''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.23 (07-27-22)|5.3.23]] ||[[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (12-15-22)|6.0.13]]  || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Vubiquity''' ||  ||  ||  ||  ||  || [[Watermark SDK Release Notes#VOD in TV Ratings Application v1.0.2.1|App v1.0.2.1]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Decoder_Certified_Vendors&amp;diff=6604</id>
		<title>Nielsen Decoder Certified Vendors</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Decoder_Certified_Vendors&amp;diff=6604"/>
		<updated>2024-04-10T22:56:58Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|TV}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:TV]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! OEM Vendor !! Product !! Product Version !! Numeris !!  Decoder !! Monitor &lt;br /&gt;
|-&lt;br /&gt;
| '''Enhanced Digital''' || '''VODSmart ||  '''1.14.1''' ||  ||  || [[Decoding SDK Release Notes#Decoder SDK Monitor v1.1.4 (12-17-2021)|1.4]]&lt;br /&gt;
|-&lt;br /&gt;
| '''EEG Enterprises''' || '''DE291''' || '''2''' ||  || [[Decoding SDK Release Notes#Audio Decoder SDK v4.1.0 (07-12-2017)|4.1.0]] || &lt;br /&gt;
|-&lt;br /&gt;
| '''Interra''' || '''Baton''' || '''5.2.2''' ||  || [[Decoding SDK Release Notes#Audio Decoder SDK v3.0.0 (05-24-2012)|3.0.0]] || &lt;br /&gt;
|-&lt;br /&gt;
| '''Interra''' || '''Baton''' || '''9.0+''' || '''✔'''  || [[Decoding SDK Release Notes#Audio Decoder SDK v6.0.17 (03-15-2023)|6.0.17]] || &lt;br /&gt;
|-&lt;br /&gt;
| '''Mediaproxy''' || '''LogServer''' || '''10.1'''|| '''✔''' || [[Decoding SDK Release Notes#Audio Decoder SDK v4.2.2 (11-15-2019)|4.2.2]] || &lt;br /&gt;
|-&lt;br /&gt;
| '''Q’ligent''' || '''Vision Probe''' || '''3.3.57''' ||  || [[Decoding SDK Release Notes#Audio Decoder SDK v3.0.0 (05-24-2012)|3.0.0]] || &lt;br /&gt;
|-&lt;br /&gt;
| '''Q’ligent''' || '''Vision Server''' || '''3.3.3''' ||  || [[Decoding SDK Release Notes#Audio Decoder SDK v3.0.0 (05-24-2012)|3.0.0]] || &lt;br /&gt;
|-&lt;br /&gt;
| '''TAG Video Systems''' || '''MCM (Multi Channel Monitor) ||  '''9000''' ||  ||  || [[Decoding SDK Release Notes#Decoder SDK Monitor v1.1.4 |1.4]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Vela''' || '''ArgoNavis'''  || '''10.0.22''' ||  || [[Decoding SDK Release Notes#Audio Decoder SDK v4.2.2 (04-26-2018)|4.2.2]] || &lt;br /&gt;
|-&lt;br /&gt;
| '''Venera Tech''' || '''Pulsar Automate''' ||  '''5.2''' ||  ||  [[Decoding SDK Release Notes#Audio Decoder SDK v3.0.0 (05-24-2012)|3.0.0]] || &lt;br /&gt;
|-&lt;br /&gt;
| '''Witbe''' || '''Video Robots ||  '''6.1''' ||  ||  || [[Decoding SDK Release Notes#Decoder SDK Monitor v1.1.4 (beta)|1.4]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=France_SDK_Metadata&amp;diff=6603</id>
		<title>France SDK Metadata</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=France_SDK_Metadata&amp;diff=6603"/>
		<updated>2024-04-10T22:56:15Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|Mediametrie Implementation Documentation}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
= France SDK Metadata =&lt;br /&gt;
Digital Metadata can pass through key values using the Nielsen reserved keys. The keys and values are listed by the product below. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Section 1''' focuses on the Content metadata&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' All metadata values should be passed as '''UTF-8 strings'''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Note:''' ''' Do not include personal data '''in the content metadata.&amp;lt;br&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Content Metadata ==&lt;br /&gt;
==== Create Content Metadata ====&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.&lt;br /&gt;
'''Note:''' All metadata values should be passed as '''UTF-8 strings'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&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;quot;content&amp;quot; for main content	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid	|| unique ID assigned to asset 	|| custom&amp;lt;br&amp;gt;(no [[Special Characters]]) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| program	|| name of program 	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| title	|| episode name	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| length	|| length of content in seconds	|| Length of content in seconds (86400 seconds for live stream (24/7). For Event-Live streams planned length. For VoD video length)||	✓&lt;br /&gt;
|-&lt;br /&gt;
|islivestn	|| Indicates if a stream is playing on a live channel&lt;br /&gt;
||&lt;br /&gt;
:&lt;br /&gt;
* &amp;quot;y&amp;quot; playing on a live channel&lt;br /&gt;
* &amp;quot;n&amp;quot; otherwise i.e. VoD&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|-&lt;br /&gt;
| subbrand	|| vcid/sub-brand/Channel  ID – value is automatically populated through provided AppID. In order to override the sub-brand configured to the App ID, value can be passed here (e.g. multiple sub-brands/Channels in the App) 	&lt;br /&gt;
||&lt;br /&gt;
provided by Nielsen &lt;br /&gt;
||&lt;br /&gt;
✓ &lt;br /&gt;
|-&lt;br /&gt;
| cli_md || mode: allows to know the streaming type	|| possible values provided by Médiamétrie: &amp;quot;LIVE&amp;quot; &amp;quot;TIMESHIFTING&amp;quot; &amp;quot;TVOD&amp;quot; &amp;quot;VOD&amp;quot; &amp;quot;SVOD&amp;quot; &amp;quot;AOD&amp;quot;|| &lt;br /&gt;
|-&lt;br /&gt;
| cli_ch	|| Channel identifier: values decided by Médiamétrie and provided to the broadcaster || sample value: &amp;quot;860&amp;quot;	|| &lt;br /&gt;
|-&lt;br /&gt;
| cli_cn	|| content identifier as used / categorized by the publisher	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p0	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p1	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p2	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p3	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p4	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p5	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p6	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p7	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p8	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p9	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p10	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p11	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p12	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p13	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p14	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p15	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p16	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p17	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p18	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| nol_p19	|| optional custom field available to publishers to pass client-defined variable 	|| custom	|| &lt;br /&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 contentMetadataObject =&lt;br /&gt;
{  &lt;br /&gt;
  type:           &amp;quot;content&amp;quot;,&lt;br /&gt;
  assetid:        &amp;quot;unique_content_id&amp;quot;,&lt;br /&gt;
  program:        &amp;quot;program name&amp;quot;,&lt;br /&gt;
  title:          &amp;quot;episode title&amp;quot;,&lt;br /&gt;
  length:         &amp;quot;length in seconds&amp;quot;,&lt;br /&gt;
  islivestn:      &amp;quot;y&amp;quot;,&lt;br /&gt;
  subbrand:       &amp;quot;c05&amp;quot;,&lt;br /&gt;
  cli_md:         &amp;quot;LIVE&amp;quot;,&lt;br /&gt;
  cli_ch:         &amp;quot;860&amp;quot;,&lt;br /&gt;
  cli_cn:         &amp;quot;customCuntentIdentifier&amp;quot;,&lt;br /&gt;
  nol_p0:         &amp;quot;p0,optionalValueP0&amp;quot;,&lt;br /&gt;
  nol_p1:         &amp;quot;p1,optionalValueP1&amp;quot;,&lt;br /&gt;
  nol_p2:         &amp;quot;p2,optionalValueP2&amp;quot;,&lt;br /&gt;
  // ...&lt;br /&gt;
  nol_p18:        &amp;quot;p18,optionalValueP18&amp;quot;,&lt;br /&gt;
  nol_p19:        &amp;quot;p19,optionaValuelP19&amp;quot;,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&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;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DCR_France_Video_iOS_SDK&amp;diff=6602</id>
		<title>DCR France Video iOS SDK</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DCR_France_Video_iOS_SDK&amp;diff=6602"/>
		<updated>2024-04-10T22:55:42Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|Mediametrie Implementation Documentation}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&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 ([[DCR &amp;amp; DTVR|DTVR]]), Digital Content Ratings ([[DCR &amp;amp; DTVR|DCR]]), and [[Digital Ad Ratings]] (DAR). 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;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
Before you start the integration, you will need:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
|| ☑ || '''App ID (appid)''' || Unique ID assigned to the player/site and configured by product. || Contact Médiamétrie&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
|| ☑ || '''Nielsen SDK''' || The Nielsen Digital AppSDK which includes SDK frameworks and '''sample implementation'''; &amp;quot;See [[iOS SDK Release Notes]]&amp;quot; || [[DCR France SDK Downloads|Download]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;blockquote&amp;gt;'''Ad flavour of AppSDK''': &amp;lt;pre style=&amp;quot;color: red&amp;quot;&amp;gt;The Ad flavour of AppSDK should be downloaded for the french market!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 1: Setting up your iOS Development Environment ==&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 SDK uses the WKWebView class instead of the deprecated UIWebView as per Apple guidelines. &lt;br /&gt;
&lt;br /&gt;
=== Importing Frameworks ===&lt;br /&gt;
&lt;br /&gt;
1) Extract “NielsenAppApi.Framework” from the Nielsen App SDK zip file and copy it to Frameworks folder of the Xcode project.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Import following frameworks and libraries into the Frameworks 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&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Include header file &amp;lt;code&amp;gt;NielsenAppApi/NielsenAppApi.h&amp;lt;/code&amp;gt; to the View Controller's header file.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* The SDK uses the NSURLSession instead of the deprecated NSURLConnection.&lt;br /&gt;
* All communications between the SDK and the Census (Collection Facility) use HTTPS&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;
&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;
&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;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 2: Create SDK Instance ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object when needed, which can then be used simultaneously. '''For the general use case where only one video is played at the same time in the App, a single instance of SDK object can then be used to play back and measure all watched streams one after another.'''&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;
{| 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 ||  ✓ || &amp;quot;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || '''value is automatically populated through App Name included in the App Resource File''' ||  || &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || '''value is automatically populated through App Version included in the App Resource File''' ||  || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1 ||	hashed (SHA256) value of member id || Nielsen-specified || || i.e. for the sample memberID &amp;quot;userMemberID123&amp;quot;, the value to pass is &amp;quot;7ed2155ee9964d69ca425b0aceccda25d5462e06228a40d0da4dce5a4eb3e826&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2 ||	hashed(SHA256) value of UID2 || Nielsen-specified || ||	 i.e. for the sample UID2 &amp;quot;userUID2&amp;quot;, the value to pass is &amp;quot;7b733f363eb756046bf72bf476d24611e931e763222a7e89537477261f7bae05&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256 ||	hashed(SHA256) value of the user email address || Nielsen-specified || ||	 i.e. for the sample email address &amp;quot;useremail@company.com&amp;quot;, the value to pass is &amp;quot;0da83f9ab3bf59e3638f96d83409878fb507d3edd4d3637ca5eae4ddda5bb969&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|enableFpid ||	Optional:turn on or off the First Party ID || Nielsen-specified || || &amp;quot;true&amp;quot; for turn on,  &amp;quot;false&amp;quot; for turn off. The default value is &amp;quot;true&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| nol_devDebug || Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|| Nielsen-specified ||  || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt; If the User consent changes while using the App, you have to delete the current SDK instance and create a new instance with the updated optout and enableFpid values. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&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;
&lt;br /&gt;
===== Using Objective-C=====&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;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
                                     @&amp;quot;hem_sha1&amp;quot;: @&amp;quot;7ed2155ee9964d69ca425b0aceccda25d5462e06228a40d0da4dce5a4eb3e826&amp;quot;,&lt;br /&gt;
            @&amp;quot;uid2&amp;quot;: @&amp;quot;7b733f363eb756046bf72bf476d24611e931e763222a7e89537477261f7bae05&amp;quot;,&lt;br /&gt;
            @&amp;quot;hem_sha256&amp;quot;: @&amp;quot;0da83f9ab3bf59e3638f96d83409878fb507d3edd4d3637ca5eae4ddda5bb969&amp;quot;,&lt;br /&gt;
           @&amp;quot;enableFpid&amp;quot;: @&amp;quot;true&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;
&lt;br /&gt;
===== Using Swift =====&lt;br /&gt;
&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;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
           &amp;quot;hem_sha1&amp;quot;: &amp;quot;7ed2155ee9964d69ca425b0aceccda25d5462e06228a40d0da4dce5a4eb3e826&amp;quot;,&lt;br /&gt;
           &amp;quot;uid2&amp;quot;: &amp;quot;7b733f363eb756046bf72bf476d24611e931e763222a7e89537477261f7bae05&amp;quot;,&lt;br /&gt;
           &amp;quot;hem_sha256&amp;quot;: &amp;quot;0da83f9ab3bf59e3638f96d83409878fb507d3edd4d3637ca5eae4ddda5bb969&amp;quot;,&lt;br /&gt;
           &amp;quot;enableFpid&amp;quot;: &amp;quot;true&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;
&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. API calls &amp;quot;play&amp;quot; and &amp;quot;loadMetadata&amp;quot; move the SDK instance into this state. In this state, the SDK instance will be able to process the API calls (see below)&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;
## appDisableApi is called&lt;br /&gt;
&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;
== Step 3: Create Metadata Objects ==&lt;br /&gt;
The parameters passed must be either a JSON formatted NSString 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, 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.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Create channelName 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;
&lt;br /&gt;
=== Create 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;
Note: All metadata values should be passed as UTF-8 strings.&lt;br /&gt;
&lt;br /&gt;
Please see the [[France SDK Metadata#Content Metadata|Mediametrie Content Metadata]] for the complete list of content metadata.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MetaData Example ===&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
NSDictionary  *channelInfo = @&lt;br /&gt;
{&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;
  {&lt;br /&gt;
  @&amp;quot;assetid&amp;quot; : @&amp;quot;unique_content_id&amp;quot;,&lt;br /&gt;
  @&amp;quot;type&amp;quot; : @&amp;quot;content&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;episode title&amp;quot;,&lt;br /&gt;
  @&amp;quot;length&amp;quot; : @&amp;quot;length in seconds&amp;quot;,&lt;br /&gt;
  @&amp;quot;islivestn&amp;quot; : @&amp;quot;y&amp;quot;,&lt;br /&gt;
  @&amp;quot;subbrand&amp;quot; : @&amp;quot;c05&amp;quot;,&lt;br /&gt;
  @&amp;quot;cli_md&amp;quot; : @&amp;quot;LIVE&amp;quot;,&lt;br /&gt;
  @&amp;quot;cli_ch&amp;quot; : @&amp;quot;860&amp;quot;,&lt;br /&gt;
  @&amp;quot;cli_cn&amp;quot; : @&amp;quot;customCuntentIdentifier&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_p0&amp;quot; : @&amp;quot;p0,optionalValueP0&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_p1&amp;quot; : @&amp;quot;p1,optionalValueP1&amp;quot;,&lt;br /&gt;
  // ...&lt;br /&gt;
  @&amp;quot;nol_p18&amp;quot; : @&amp;quot;p18,optionalValueP18&amp;quot;,&lt;br /&gt;
  @&amp;quot;nol_p19&amp;quot; : @&amp;quot;p19,optionalValueP19&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Using 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;assetid&amp;quot; : &amp;quot;unique_content_id&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot; : &amp;quot;content&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;episode title&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot; : &amp;quot;length in seconds&amp;quot;,&lt;br /&gt;
        &amp;quot;islivestn&amp;quot; : &amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;subbrand&amp;quot; : &amp;quot;c05&amp;quot;,&lt;br /&gt;
        &amp;quot;cli_md&amp;quot; : &amp;quot;LIVE&amp;quot;,&lt;br /&gt;
        &amp;quot;cli_ch&amp;quot; : &amp;quot;860&amp;quot;,&lt;br /&gt;
        &amp;quot;cli_cn&amp;quot; : &amp;quot;customCuntentIdentifier&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_p0&amp;quot; : &amp;quot;p0,optionalValueP0&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_p1&amp;quot; : &amp;quot;p1,optionalValueP1&amp;quot;,&lt;br /&gt;
        // ...&lt;br /&gt;
        &amp;quot;nol_p18&amp;quot; : &amp;quot;p18,optionalValueP18&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_p19&amp;quot; : &amp;quot;p19,optionaValuelP19&amp;quot;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4: Start the Measurement ==&lt;br /&gt;
&lt;br /&gt;
=== Overview of SDK API Calls ===&lt;br /&gt;
&lt;br /&gt;
==== play ====&lt;br /&gt;
The play method prepares the SDK for reporting once an asset has loaded and playback has begun. Use play to pass the channel descriptor information through channelName parameter when the user taps the '''Play''' button on the player. Call play only when initially starting the video.&lt;br /&gt;
===== Using Objective-C =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;[self.nielsenAppApi play:channelInfo];&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Using Swift =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;self.nielsenAppApi?.play(channelInfo);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== loadMetadata ====&lt;br /&gt;
Needs to be called at the beginning of each asset, pass JSON object for relevant content. Make sure to pass as 1st loadMetadata for content at the begining of playlist - see below API call sequence examples.&lt;br /&gt;
===== Using Objective-C =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;[self.nielsenAppApi loadMetadata:metadataDict];&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Using Swift =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;self.nielsenAppApi?.loadMetadata(metadataDict)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== playheadPosition ====&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:#d0f6f8&amp;quot;&amp;gt;&lt;br /&gt;
Note: &amp;quot;playheadPosition&amp;quot; has to be called every second and the value passed should match the broadcast time for live channel.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* VOD: current position in seconds. Pass whole number that increments only by 1 like 0,1,2,3... &amp;lt;br/&amp;gt;&lt;br /&gt;
* Live: Unix timestamp matching the broadcast time for Content (seconds since Jan-1-1970 UTC). Pass whole number that increments only by 1 like 1631098029,1631098030,1631098031,1631098032,... &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Objective-C =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
[self.nielsenAppApi playheadPosition:pos];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Using Swift =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
self.nielsenAppApi?.playheadPosition(pos);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== stop ====&lt;br /&gt;
Call when&lt;br /&gt;
* ads complete playing&lt;br /&gt;
* when a user pauses playback&lt;br /&gt;
* when an Ad Break starts during the Content Playback&lt;br /&gt;
* upon any user interruption scenario - see bellow chapter Interruption scenario&lt;br /&gt;
===== Using Objective-C =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;[self.nielsenAppApi stop];&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Using Swift =====&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;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== end ====&lt;br /&gt;
Call when the content asset completes playback.  Stops measurement progress.&lt;br /&gt;
===== Using Objective-C =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;[self.nielsenAppApi end];&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Using Swift =====&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;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Start the Measurement ===&lt;br /&gt;
In order to start the measurement, follow the 3 first steps below i.e. for Content without Ads. When terminating the Content playback call &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; to terminate the Content Measurement for the given asset.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | 1. Start of stream || &amp;lt;code&amp;gt;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;loadMetadata(contentMetadataObject)&amp;lt;/code&amp;gt; || contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| 2. Content is playing|| &amp;lt;code&amp;gt;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;
| 3. End of Stream || &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; || Content playback is completed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Step 5: Stop/Resume the Measurement for video Playback Interruptions ==&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;
* When an Ad Break starts during the Content Playback&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 &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; immediately (except when content is buffering) and withhold sending playhead position.&lt;br /&gt;
* Once the playback resumes, start sending pings &amp;lt;code&amp;gt;playheadPosition&amp;lt;/code&amp;gt; for the new viewing session.&lt;br /&gt;
Please see the [[Digital Measurement FAQ]] for more details&lt;br /&gt;
&lt;br /&gt;
== Step 6: Review SDK Integration Architecture Diagram ==&lt;br /&gt;
&lt;br /&gt;
=== For Content Playback ===&lt;br /&gt;
&lt;br /&gt;
[[File:nlsn-sdk-achitecture-diagram-content-fr.png||SDK Integration Architecture Diagram - Content]]&lt;br /&gt;
&lt;br /&gt;
== Step 7 : Disclose Nielsen Privacy Statement ==&lt;br /&gt;
The App SDK uses Mobile Ad IDs (Android ID or IDFA) which are fully hashed on the device before being sent to Nielsen (Nielsen never receives un-hashed values).&lt;br /&gt;
Users retain the possibility to oppose the use of Mobile Ad IDs, or to reset them, by using the functionality provided by the mobile operating system (iOS or Android).&lt;br /&gt;
&lt;br /&gt;
In order to disclose Nielsen measurement privacy statement, please include the following items in your privacy policy:&lt;br /&gt;
* A notice that the player includes third party measurement software that allows users to contribute to market research.&lt;br /&gt;
* A link to the Nielsen Digital Measurement Privacy Policy located at https://www.nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/ .&lt;br /&gt;
&lt;br /&gt;
=== Initialization of the SDK based on User Consent in your App ===&lt;br /&gt;
&lt;br /&gt;
In collaboration with Mediametrie, the following user consent use cases need to be implemented in your App.&lt;br /&gt;
&lt;br /&gt;
==== The user explicitly accepts measurement ====&lt;br /&gt;
 The SDK is initialized and all IDs are captured. The SDK Opt-in Flags have to be set accordingly, see:&lt;br /&gt;
&lt;br /&gt;
* [[#User opted in|User opted in]]&lt;br /&gt;
* [[#First Party ID turned on|First Party ID turned on]]&lt;br /&gt;
&lt;br /&gt;
==== The user explicitly refuses measurement ====&lt;br /&gt;
The SDK is NOT initialized and No Nielsen SDK measurement will occur.&lt;br /&gt;
&lt;br /&gt;
==== The user did not explicitly give consent for the measurement(consent neither given nor refused) ====&lt;br /&gt;
 The SDK is initialized and no IDs are captured. The SDK Opt-out Flags have to be set accordingly, see:&lt;br /&gt;
* [[#User opted out|User opted out]]&lt;br /&gt;
* [[#First Party ID turned off|First Party ID turned off]]&lt;br /&gt;
&lt;br /&gt;
=== Turning off the First Party ID for Opt-out Users during the SDK Initializazion ===&lt;br /&gt;
The First Party ID(FPID) is enabled by default in the Browser SDK. For Opt-out users, the First Party ID can be turned off during the initialization of the SDK Instance, i.e. the parameter enableFpid can be set to &amp;quot;false&amp;quot; (FPID disabled) or &amp;quot;true&amp;quot; (FPID enabled). &lt;br /&gt;
&lt;br /&gt;
===== Example of SDK Initialization with enableFpid =====&lt;br /&gt;
&lt;br /&gt;
====== First Party ID turned on ======&lt;br /&gt;
======= Using Objective-C=======&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;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
           @&amp;quot;enableFpid&amp;quot;: @&amp;quot;true&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;
&lt;br /&gt;
======= Using Swift =======&lt;br /&gt;
&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;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
           &amp;quot;enableFpid&amp;quot;: &amp;quot;true&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;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== First Party ID turned off ======&lt;br /&gt;
======= Using Objective-C=======&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;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
           @&amp;quot;enableFpid&amp;quot;: @&amp;quot;false&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;
&lt;br /&gt;
======= Using Swift =======&lt;br /&gt;
&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;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;,&lt;br /&gt;
           &amp;quot;enableFpid&amp;quot;: &amp;quot;false&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;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Setting the  SDK global optout Flag for Opt-out Users  ===&lt;br /&gt;
The Optoout Flag is set by default to &amp;quot;false&amp;quot; in the AppSDK SDK. For Opt-out users, the Optout Flag can be set. Immediately after creating the AppSDK Instance, set the Optout Flag using the userOptOut AppSDK API.&lt;br /&gt;
&lt;br /&gt;
===== Example the Ouptout Flag =====&lt;br /&gt;
&lt;br /&gt;
====== User opted out ======&lt;br /&gt;
&amp;lt;syntaxhighlight &amp;gt;&lt;br /&gt;
NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== User opted in======&lt;br /&gt;
&amp;lt;syntaxhighlight &amp;gt;&lt;br /&gt;
NielsenAppApi?.userOptOut(&amp;quot;nielsenappsdk://0&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Step 8 : Review the Reference Implementation for VoD and Live Streams ==&lt;br /&gt;
&lt;br /&gt;
The Reference Implementation covers VoD and Live use cases. &lt;br /&gt;
The code also covers also DAI (Dynamic Ad Insertion) that should be ignored since No Ads are measured in France.&lt;br /&gt;
&lt;br /&gt;
Download the Reference Implementation for iOS [https://nielsenonlinesupport.com/dk/ios/DKRefImplSwift.zip DKRefImplSwift].&lt;br /&gt;
Unzip and open the project in Xcode, then run it i.e. in the simulator or on iOS device and then filter the Xcode output with &amp;quot;##&amp;quot; in order to see only relevant Nielsen SDK API Calls, as below:&lt;br /&gt;
&amp;lt;syntaxhighlight&lt;br /&gt;
==##&amp;gt; Nielsen SDK NielsenInit.getAppApi() - create Instance &lt;br /&gt;
==##!!&amp;gt; LandingVC -- viewDidAppear&lt;br /&gt;
==##!!&amp;gt; LandingVC -- Nielsen SDK eventOccurred&lt;br /&gt;
==##&amp;gt; Nielsen SDK .play(sdkMethods.loadChannelInfo())&lt;br /&gt;
==##&amp;gt; Nielsen SDK nielsenApi.loadMetadata&lt;br /&gt;
==##&amp;gt; Nielsen SDK updatePlayheadPosition, pos = 0 / 378&lt;br /&gt;
==##&amp;gt; Nielsen SDK updatePlayheadPosition, pos = 1 / 378&lt;br /&gt;
==##&amp;gt; Nielsen SDK updatePlayheadPosition, pos = 2 / 378&lt;br /&gt;
==##&amp;gt; Nielsen SDK updatePlayheadPosition, pos = 3 / 378&lt;br /&gt;
==##&amp;gt; Nielsen SDK updatePlayheadPosition, pos = 4 / 378&lt;br /&gt;
==##&amp;gt; terminatePlaybackSession Nielsen SDK end()&lt;br /&gt;
==##!!&amp;gt; LandingVC -- viewDidAppear&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 9 :  Test your player by yourself ==&lt;br /&gt;
=== Guide ===&lt;br /&gt;
1. Connect your PC and test device (tablet or phone) via same router.&amp;lt;br /&amp;gt;&lt;br /&gt;
2. PC side: run Proxy sw (like Charles) and get local IP&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Test device: modify Wifi setting to pass through Proxy IP from step 2.&amp;lt;br /&amp;gt;&lt;br /&gt;
4. Test device: run your player, launch video&amp;lt;br /&amp;gt;&lt;br /&gt;
5. PC side: filter traffic by &amp;quot;nmr&amp;quot; and confirm presence of GN pings&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example of GN ping ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://secure-fr.nmrodam.com/cgi-bin/gn?prd=dcr&amp;amp;ci=us-500207&amp;amp;ch=us-500207_c77_P&amp;amp;asn=defChnAsset&amp;amp;fp_id=&amp;amp;fp_cr_tm=&amp;amp;fp_acc_tm=&amp;amp;fp_emm_tm=&amp;amp;ve_id=&amp;amp;devmodel=&amp;amp;manuf=&amp;amp;sysname=&amp;amp;sysversion=&amp;amp;sessionId=zlmmxkq867zt4bpnumlyz6dpn9hyp1610980356&amp;amp;tl=Episode%201&amp;amp;prv=1&amp;amp;c6=vc%2Cc77&amp;amp;ca=us-500207_c77_VID5556674-123456&amp;amp;cg=TAMSample%20DK&amp;amp;c13=asid%2CP10DF14BA-937E-436D-99DF-ED39A0422387&amp;amp;c32=segA%2CNA&amp;amp;c33=segB%2CNA&amp;amp;c34=segC%2CNA&amp;amp;c15=apn%2C&amp;amp;plugv=&amp;amp;playerv=&amp;amp;sup=1&amp;amp;segment2=&amp;amp;segment1=&amp;amp;forward=0&amp;amp;ad=0&amp;amp;cr=4_00_99_V1_00000&amp;amp;c9=devid%2C&amp;amp;enc=true&amp;amp;c1=nuid%2C999&amp;amp;at=view&amp;amp;rt=video&amp;amp;c16=sdkv%2Cbj.6.0.0&amp;amp;c27=cln%2C0&amp;amp;crs=&amp;amp;lat=&amp;amp;lon=&amp;amp;c29=plid%2C16109803568088038&amp;amp;c30=bldv%2C6.0.0.563&amp;amp;st=dcr&amp;amp;c7=osgrp%2C&amp;amp;c8=devgrp%2C&amp;amp;c10=plt%2C&amp;amp;c40=adbid%2C&amp;amp;c14=osver%2CNA&amp;amp;c26=dmap%2C1&amp;amp;dd=&amp;amp;hrd=&amp;amp;wkd=&amp;amp;c35=adrsid%2C&amp;amp;c36=cref1%2C&amp;amp;c37=cref2%2C&amp;amp;c11=agg%2C1&amp;amp;c12=apv%2C&amp;amp;c51=adl%2C0&amp;amp;c52=noad%2C0&amp;amp;sd=170&amp;amp;devtypid=&amp;amp;pc=NA&amp;amp;c53=fef%2Cy&amp;amp;c54=oad%2C20200713%2010%3A22%3A00&amp;amp;c55=cref3%2C&amp;amp;c57=adldf%2C2&amp;amp;ai=VID5556674-123456&amp;amp;c3=st%2Cc&amp;amp;c64=starttm%2C1610980392&amp;amp;adid=VID5556674-123456&amp;amp;c58=isLive%2Cfalse&amp;amp;c59=sesid%2Cgezrb92q4i9b9jg7acxgn783gjw0a1610980365&amp;amp;c61=createtm%2C1610980392&amp;amp;c63=pipMode%2C&amp;amp;c68=bndlid%2C&amp;amp;nodeTM=&amp;amp;logTM=&amp;amp;c73=phtype%2C&amp;amp;c74=dvcnm%2C&amp;amp;c76=adbsnid%2C&amp;amp;c77=adsuprt%2C2&amp;amp;uoo=&amp;amp;evdata=&amp;amp;c71=ottflg%2C0&amp;amp;c72=otttyp%2Cnone&amp;amp;c44=progen%2C&amp;amp;davty=0&amp;amp;si=http%3A%2F%2Fnielsenonlinesupport.com%2Fdk%2Findex.htm&amp;amp;c66=mediaurl%2Cassets%252FRTVOD_C3%252Fprog_index.m3u8&amp;amp;c62=sendTime%2C1610980392&amp;amp;rnd=714644&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 10 :  Provide your app for certification ==&lt;br /&gt;
Once ready, please send a request (https://portail-marqueurs.mediametrie.com) to Médiamétrie local staff for certification.&lt;br /&gt;
&lt;br /&gt;
== Step 11 :  Going Live ==&lt;br /&gt;
After the integration has been certified (but not prior that), disable debug logging by deleting {nol_devDebug: &amp;quot;DEBUG&amp;quot;} from initialization call - see Step 2.&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DCR_France_Video_Browser_SDK&amp;diff=6601</id>
		<title>DCR France Video Browser SDK</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DCR_France_Video_Browser_SDK&amp;diff=6601"/>
		<updated>2024-04-10T22:55:17Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|Mediametrie Implementation Documentation}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&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 Browser SDK (BSDK) is the framework for browser application developers to integrate Nielsen Measurement into their media players. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings ([[DCR &amp;amp; DTVR|DTVR]]) and Digital Content Ratings ([[DCR &amp;amp; DTVR|DCR]]). Nielsen SDKs are also equipped to measure static content and can track key life cycle events.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
Before you start the integration, you will need:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
|| ☑ || '''App ID (appid)''' || Unique ID assigned to the player/site and configured by product. || Contact Médiamétrie&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Review SDK Integration Architecture Diagram ===&lt;br /&gt;
&lt;br /&gt;
==== For Content Playback ====&lt;br /&gt;
&lt;br /&gt;
[[File:nlsn-sdk-achitecture-diagram-content-fr.png||SDK Integration Architecture Diagram - Content]]&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;
=== Add Static Queue Snippet ===&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;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website i.e. within the &amp;lt;head&amp;gt;&amp;lt;/head&amp;gt; tag :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(e,n){&lt;br /&gt;
  function t(e){&lt;br /&gt;
    return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
  }&lt;br /&gt;
  e[n]=e[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(o,r,c){&lt;br /&gt;
      var s=e.document,&lt;br /&gt;
      a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
      a.async=1,&lt;br /&gt;
      a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.nmrodam.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
      var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
      return i.parentNode.insertBefore(a,i),&lt;br /&gt;
      e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
      ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}&lt;br /&gt;
catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
      trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}&lt;br /&gt;
catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
      e[n][r]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&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;
&amp;lt;br&amp;gt;&lt;br /&gt;
For creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; is optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Source !! Required !! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/website || Nielsen-specified || ✓  ||	&amp;quot;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance || Nielsen-specified || ✓ ||	&amp;quot;any string value&amp;quot; i.e. &amp;quot;TVnamevideoSdkInstance&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1 ||	hashed (SHA256) value of member id || Nielsen-specified || ||	 i.e. for the sample memberID &amp;quot;userMemberID123&amp;quot;, the value to pass is &amp;quot;7ed2155ee9964d69ca425b0aceccda25d5462e06228a40d0da4dce5a4eb3e826&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2 ||	hashed(SHA256) value of UID2 || Nielsen-specified || ||	 i.e. for the sample UID2 &amp;quot;userUID2&amp;quot;, the value to pass is &amp;quot;7b733f363eb756046bf72bf476d24611e931e763222a7e89537477261f7bae05&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256 ||	hashed(SHA256) value of the user email address || Nielsen-specified || ||	 i.e. for the sample email address &amp;quot;useremail@company.com&amp;quot;, the value to pass is &amp;quot;0da83f9ab3bf59e3638f96d83409878fb507d3edd4d3637ca5eae4ddda5bb969&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout ||	Optional: OptOut global parameter. This optout will be maintained through the session of the SDK instance || Nielsen-specified ||  || &amp;quot;true&amp;quot; for opted out,  &amp;quot;false&amp;quot; for NOT opted out or opted in. The default value is &amp;quot;false&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|enableFpid ||	Optional:turn on or off the First Party ID || Nielsen-specified ||  || &amp;quot;true&amp;quot; for turn on,  &amp;quot;false&amp;quot; for turn off. The default value is &amp;quot;true&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging if desired. || Nielsen-specified || 	|| &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{nol_sdkDebug: &amp;quot;debug&amp;quot;} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;appid&amp;gt;.js, will be downloaded based on the appid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Call ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;TVnamevideoSdkInstance&amp;quot;, {&lt;br /&gt;
    hem_sha1: &amp;quot;7ed2155ee9964d69ca425b0aceccda25d5462e06228a40d0da4dce5a4eb3e826&amp;quot;,&lt;br /&gt;
    uid2: &amp;quot;7b733f363eb756046bf72bf476d24611e931e763222a7e89537477261f7bae05&amp;quot;,&lt;br /&gt;
    hem_sha256: &amp;quot;0da83f9ab3bf59e3638f96d83409878fb507d3edd4d3637ca5eae4ddda5bb969&amp;quot;,&lt;br /&gt;
    optout: &amp;quot;false&amp;quot;,&lt;br /&gt;
    enableFpid: &amp;quot;true&amp;quot;,&lt;br /&gt;
    nol_sdkDebug: &amp;quot;debug&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt; If the User consent changes while using the App, you have to delete the current SDK instance and create a new instance with the updated optout and enableFpid values. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create Metadata Objects ===&lt;br /&gt;
Before starting any measurement of an asset with the created SDK Instance, you need to create an asset metadata object in order to identify the asset. &lt;br /&gt;
There are two types of asset metadata but only one is used for Mediametrie:&lt;br /&gt;
*content: identify a video&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 are passed through key-values using the Nielsen reserved keys. You will need to set up content object with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
&lt;br /&gt;
==== Create 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;
Please see the [[France SDK Metadata#Content Metadata|Mediametrie Content Metadata]] for the complete list of content metadata.&lt;br /&gt;
&lt;br /&gt;
Note: All metadata values should be passed as UTF-8 strings.&lt;br /&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;
=== Start the Measurement ===&lt;br /&gt;
Nielsen APIs calls are made by calling the function ggPM(&amp;quot;event&amp;quot;, parameter, ...) with &amp;quot;event&amp;quot; Parameter indicating the SDK API.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;event&amp;quot;, parameter, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;loadMetadata&amp;quot;	|| content metadata object	|| Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;setPlayheadPosition&amp;quot;	|| playhead position as integer&amp;lt;br/&amp;gt;&lt;br /&gt;
* VOD: current position in seconds. Pass whole number that increments only by 1 like 0,1,2,3... &amp;lt;br/&amp;gt;&lt;br /&gt;
* Live: Unix timestamp matching the broadcast time for Content (seconds since Jan-1-1970 UTC). Pass whole number that increments only by 1 like 1631098029,1631098030,1631098031,1631098032,... &amp;lt;br/&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback, the value passed should match the broadcast time for live channel.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;stop&amp;quot; ||	playhead position in seconds	|| Call when content interrupted/paused and stop passing playhead position. Do the same also when an Ad Break starts during the Content Playback.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;end&amp;quot;	|| playhead position in seconds	|| Call when the current video asset completes playback and pass the playhead position. &amp;lt;br/&amp;gt;&lt;br /&gt;
Example: At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Start the measurement by calling the &amp;quot;event&amp;quot; names &amp;quot;loadMetadata&amp;quot; followed by &amp;quot;setPlayheadPosition&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// START OF STREAM  (main content)&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;loadMetadata&amp;quot;, contentMetadataObject); &lt;br /&gt;
// CONTENT plays&lt;br /&gt;
// pass playhead every second&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;setPlayheadPosition&amp;quot;, playheadPosition);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stop/Resume the Measurement for video Playback Interruptions ==&lt;br /&gt;
&lt;br /&gt;
=== Handle Video Playback Interruption ===&lt;br /&gt;
The setPlayheadPostion event is used for handling playback interruption. To indicate that the video player is not playing (i.e. paused, buffering), stop passing the playhead position to the SDK. &lt;br /&gt;
Once the Playback resumes , begin sending the playhead position again with the correct playhead value.&lt;br /&gt;
&lt;br /&gt;
=== List of video Playback Interruptions ===&lt;br /&gt;
The following possible  video Playback Interruptions must be handled:&lt;br /&gt;
* Player PAUSED&lt;br /&gt;
* Player BUFFERING&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;
* Network Loss&lt;br /&gt;
&lt;br /&gt;
=== Example for handling Playback Interruption: Browser/Tab close/Page Reload ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener(&amp;quot;beforeunload&amp;quot;, function(event) &lt;br /&gt;
{ &lt;br /&gt;
  // Indicate &amp;lt;end&amp;gt; for the content&lt;br /&gt;
  nSdkInstance.ggPM(&amp;quot;end&amp;quot;, playheadPosition);&lt;br /&gt;
});&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;
  // Indicate &amp;lt;end&amp;gt; for the content&lt;br /&gt;
  nSdkInstance.ggPM(&amp;quot;end&amp;quot;, playheadPosition);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' additional code may be  needed in order to support specific browser versions (e.g. older versions of Internet Explorer).&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK Call Sequence ==&lt;br /&gt;
The sample event lifecycles can be used as a reference for identifying the order for calling events.&lt;br /&gt;
&lt;br /&gt;
=== Content Playback Call Sequence ===&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(&amp;quot;loadMetadata&amp;quot;, contentMetadataObject); &lt;br /&gt;
// CONTENT plays&lt;br /&gt;
// pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;setPlayheadPosition&amp;quot;, playheadPosition);&lt;br /&gt;
//&lt;br /&gt;
// END OF STREAM&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;end&amp;quot;, playheadPosition);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
* &amp;quot;setPlayheadPosition&amp;quot; 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 &amp;quot;stop&amp;quot; or &amp;quot;end&amp;quot;.&lt;br /&gt;
* When content has resumed following an ad break, the playhead position update must continue where previous content segment left off. &lt;br /&gt;
* The playhead position should be passed as a rounded number with no decimals.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Review the Reference Implementation for VoD and Live Streams ==&lt;br /&gt;
&lt;br /&gt;
The Reference Implementation covers vod and Live use cases. &lt;br /&gt;
The code also covers also DAI (Dynamic Ad Insertion) that should be ignored since No Ads are measured in France.&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;br&amp;gt;	&lt;br /&gt;
Make sure the country &amp;quot;France&amp;quot; is selected in the country dropdown list.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In order to start live stream select the checkbox &amp;quot;isLive&amp;quot; below the video player.&lt;br /&gt;
&lt;br /&gt;
Start the Reference Implementation for Mediametrie [https://nielsenonlinesupport.com/mediametrie/sdkRefImpl/index.htm sdkRefImpl].&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Review the Nielsen SDK Call Sequence below the Video Player.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disclose Nielsen Privacy Statement ==&lt;br /&gt;
The Browser SDK video measurement does not set cross-domain cookies, therefore no centralized opt-out functionality is available. The Nielsen Browser SDK does not set cookies associated with the collection domain. The SDK sets specific cookie for the domain where the player is hosted (first party) and this cookie is not used across websites.&lt;br /&gt;
The only personal information collected with the SDK network pings is the IP address, which is  anonymized immediately after collection.&lt;br /&gt;
&lt;br /&gt;
In order to disclose Nielsen measurement privacy statement, please include the following items in your privacy policy:&lt;br /&gt;
* A notice that the player includes third party measurement software that allows users to contribute to market research.&lt;br /&gt;
* A link to the Nielsen Digital Measurement Privacy Policy located at https://www.nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/ .&lt;br /&gt;
&lt;br /&gt;
=== Initialization of the SDK based on User Consent in your App ===&lt;br /&gt;
&lt;br /&gt;
In collaboration with Mediametrie, the following user consent use cases need to be implemented in your App.&lt;br /&gt;
&lt;br /&gt;
==== The user explicitly accepts measurement ====&lt;br /&gt;
 The SDK is initialized and all IDs are captured. The SDK Opt-in Flags have to be set accordingly, see:&lt;br /&gt;
&lt;br /&gt;
* [[#User opted in|User opted in]]&lt;br /&gt;
* [[#First Party ID turned on|First Party ID turned on]]&lt;br /&gt;
&lt;br /&gt;
==== The user explicitly refuses measurement ====&lt;br /&gt;
The SDK is NOT initialized and No Nielsen SDK measurement will occur.&lt;br /&gt;
&lt;br /&gt;
==== The user did not explicitly give consent for the measurement(consent neither given nor refused) ====&lt;br /&gt;
 The SDK is initialized and no IDs are captured. The SDK Opt-out Flags have to be set accordingly, see:&lt;br /&gt;
* [[#User opted out|User opted out]]&lt;br /&gt;
* [[#First Party ID turned off|First Party ID turned off]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Turning off the First Party ID for Opt-out Users during the SDK Initializazion ===&lt;br /&gt;
The First Party ID(FPID) is enabled by default in the Browser SDK. For Opt-out users, the First Party ID can be turned off during the initialization of the SDK Instance, i.e. the parameter enableFpid can be set to &amp;quot;false&amp;quot; (FPID disabled) or &amp;quot;true&amp;quot; (FPID enabled). &lt;br /&gt;
&lt;br /&gt;
===== Example of SDK Initialization with enableFpid =====&lt;br /&gt;
&lt;br /&gt;
====== First Party ID turned on ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance = NOLBUNDLE.nlsQ(appID, &amp;quot;TVnamevideoSdkInstance&amp;quot;, {&lt;br /&gt;
	enableFpid: &amp;quot;true&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== First Party ID turned off ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance = NOLBUNDLE.nlsQ(appID, &amp;quot;TVnamevideoSdkInstance&amp;quot;, {&lt;br /&gt;
	enableFpid: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting the  SDK global optout Flag for Opt-out Users during the SDK Initializazion ===&lt;br /&gt;
The Optoout Flag is set by default to &amp;quot;false&amp;quot; in the Browser SDK. For Opt-out users, the Optout Flag can be set to &amp;quot;true&amp;quot; during the initialization of the SDK Instance, i.e. the parameter outpout can be set to &amp;quot;true&amp;quot; (opted out) or &amp;quot;false&amp;quot; (opted in or NOT opted out). &lt;br /&gt;
&lt;br /&gt;
===== Example of SDK Initialization with the Ouptout Flag =====&lt;br /&gt;
&lt;br /&gt;
====== User opted out ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance = NOLBUNDLE.nlsQ(appID, &amp;quot;TVnamevideoSdkInstance&amp;quot;, {&lt;br /&gt;
    optout: &amp;quot;true&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== User opted in ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance = NOLBUNDLE.nlsQ(appID, &amp;quot;TVnamevideoSdkInstance&amp;quot;, {&lt;br /&gt;
	optout: &amp;quot;false&amp;quot; &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test your player by yourself ==&lt;br /&gt;
=== Guide ===&lt;br /&gt;
1. Run your player in the Browser, start a video&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Open the Developer Network View in order to monitor network traffic&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Filter the network traffic by &amp;quot;nmr&amp;quot; and confirm presence of GN pings&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example of GN ping ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://secure-fr.nmrodam.com/cgi-bin/gn?prd=dcr&amp;amp;ci=us-500207&amp;amp;ch=us-500207_c77_P&amp;amp;asn=defChnAsset&amp;amp;fp_id=xknspa6p3viv2medizzvw8tld2smg1682583576&amp;amp;fp_cr_tm=1682583576685&amp;amp;fp_acc_tm=1684322226258&amp;amp;fp_emm_tm=1684322226288&amp;amp;ve_id=&amp;amp;sessionId=c81tzsiqvhqm6zswkeftmjjyip3fe1684322243&amp;amp;tl=Episode%201&amp;amp;prv=1&amp;amp;c6=vc,c77&amp;amp;ca=us-500207_c77_VID5556674-123456&amp;amp;cg=TAMSample%20FR&amp;amp;c13=asid,P1D11AF9D-E3FE-438C-B861-ED47543FF0E2&amp;amp;c32=segA,NA&amp;amp;c33=segB,NA&amp;amp;c34=segC,NA&amp;amp;c15=apn,&amp;amp;plugv=&amp;amp;playerv=&amp;amp;sup=1&amp;amp;segment2=&amp;amp;segment1=&amp;amp;forward=0&amp;amp;ad=0&amp;amp;cr=4_00_99_D1_00000&amp;amp;c9=devid,&amp;amp;enc=true&amp;amp;c1=nuid,999&amp;amp;at=timer&amp;amp;rt=video&amp;amp;c16=sdkv,bj.6.0.0&amp;amp;c27=cln,6&amp;amp;crs=&amp;amp;lat=&amp;amp;lon=&amp;amp;c29=plid,16843222430632178&amp;amp;c30=bldv,6.0.0.662&amp;amp;st=dcr&amp;amp;c7=osgrp,&amp;amp;c8=devgrp,&amp;amp;c10=plt,&amp;amp;c40=adbid,&amp;amp;c14=osver,NA&amp;amp;c26=dmap,1&amp;amp;dd=&amp;amp;hrd=&amp;amp;wkd=&amp;amp;c35=adrsid,&amp;amp;c36=cref1,&amp;amp;c37=cref2,&amp;amp;c11=agg,1&amp;amp;c12=apv,&amp;amp;c51=adl,15&amp;amp;c52=noad,0&amp;amp;sd=170&amp;amp;pc=NA&amp;amp;c53=fef,y&amp;amp;c54=oad,20200713%2010%3A22%3A00&amp;amp;c55=cref3,&amp;amp;c57=adldf,2&amp;amp;ai=VID5556674-123456&amp;amp;c3=st,c&amp;amp;c64=starttm,1684322269&amp;amp;adid=VID5556674-123456&amp;amp;c58=isLive,false&amp;amp;c59=sesid,3dn2br9l4y9rr2iuxycsdnlh3zwvd1684322245&amp;amp;c61=createtm,1684322275&amp;amp;c63=pipMode,&amp;amp;c68=bndlid,&amp;amp;nodeTM=&amp;amp;logTM=&amp;amp;c73=phtype,&amp;amp;c74=dvcnm,&amp;amp;c76=adbsnid,&amp;amp;c77=adsuprt,2&amp;amp;uoo=&amp;amp;evdata=&amp;amp;c71=ottflg,0&amp;amp;c72=otttyp,none&amp;amp;c44=progen,&amp;amp;davty=1&amp;amp;si=https%3A%2F%2Fnielsenonlinesupport.com%2Fmichel%2Fmediametrie%2FsdkRefImpl%2Findex.htm&amp;amp;c66=mediaurl,assets%252FRTVOD_C3%252Fprog_index.m3u8&amp;amp;sdd=&amp;amp;c62=sendTime,1684322275&amp;amp;rnd=582363&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Provide your app for certification ==&lt;br /&gt;
Once ready, please send a request (https://portail-marqueurs.mediametrie.com) to Médiamétrie local staff for certification.&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified (but not prior that), disable debug logging by deleting {nol_sdkDebug: &amp;quot;DEBUG&amp;quot;} from Initialization API Call.&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DCR_France_Video_Android_SDK&amp;diff=6600</id>
		<title>DCR France Video Android SDK</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DCR_France_Video_Android_SDK&amp;diff=6600"/>
		<updated>2024-04-10T22:54:30Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|Mediametrie Implementation Documentation}}  {{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  It supports a variety of Nielsen Measurement Products like Digital in TV Ratings ([[DCR &amp;amp; DTVR|DTVR]]), Digital Content Ratings ([[DCR &amp;amp; DTVR|DCR]]), and [[Digital Ad Ratings]] (DAR). 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;
Before you start the integration, you will need:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
|| ☑ || &amp;quot;App ID (appid)&amp;quot; || Unique ID assigned to the player/site and configured by product. || Contact Médiamétrie&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
|| ☑ || &amp;quot;Nielsen SDK&amp;quot; || The Nielsen Digital AppSDK which includes SDK frameworks and &amp;quot;sample implementation&amp;quot;; &amp;quot;See [[Android SDK Release Notes]]&amp;quot; || [[DCR France SDK Downloads|Download]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;blockquote&amp;gt;'''Ad flavour of AppSDK''': &amp;lt;pre style=&amp;quot;color: red&amp;quot;&amp;gt;The Ad flavour of AppSDK should be downloaded for the french market!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 1: Setting up your Android Development Environment  ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
1) Ensure to unzip the Nielsen App SDK zip file and copy the &amp;quot;AppSdk.jar&amp;quot; into the app/libs folder on the App’s project. Add it as dependency.&amp;lt;br /&amp;gt;&lt;br /&gt;
2) Add the following permissions on the project’s &amp;quot;AndroidManifest.xml&amp;quot; file.&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;
&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;
3) Add Google Play Services lib into dependencies as Nielsen AppSDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
Libraries:&lt;br /&gt;
* com.google.android.gms:play-services&lt;br /&gt;
Requiered Google Play Service CLasses and Packages :&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;
4) Once the files are in place, import com.nielsen.app.sdk to the java source code and start accessing the public interface.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;import com.nielsen.app.sdk.*;&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
*The Nielsen App SDK (located in the &amp;quot;com.nielsen.app.sdk&amp;quot; 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;
*Nielsen App SDK is compatible with Android OS versions 2.3+.&lt;br /&gt;
*Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.&lt;br /&gt;
*The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 4.0 and later will support it natively).&lt;br /&gt;
*If the player application uses a 3rd party media player implementing its own HLS/MPEG-DASH stack, 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;
&lt;br /&gt;
== Step 2: Create SDK Instance ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object when needed, which can then be used simultaneously. '''For the general use case where only one video is played at the same time in the App, a single instance of SDK object can then be used to play back and measure all watched streams one after another.'''&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;
{| 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 || ✓ || &amp;quot;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || '''value is automatically populated through App Name included in the App Resource File''' ||  || &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || '''value is automatically populated through App version included in the App Resource File''' ||  || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1 ||	hashed (SHA256) value of member id || Nielsen-specified || || i.e. for the sample memberID &amp;quot;userMemberID123&amp;quot;, the value to pass is &amp;quot;7ed2155ee9964d69ca425b0aceccda25d5462e06228a40d0da4dce5a4eb3e826&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2 ||	hashed(SHA256) value of UID2 || Nielsen-specified || ||	 i.e. for the sample UID2 &amp;quot;userUID2&amp;quot;, the value to pass is &amp;quot;7b733f363eb756046bf72bf476d24611e931e763222a7e89537477261f7bae05&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256 ||	hashed(SHA256) value of the user email address || Nielsen-specified || ||	 i.e. for the sample email address &amp;quot;useremail@company.com&amp;quot;, the value to pass is &amp;quot;0da83f9ab3bf59e3638f96d83409878fb507d3edd4d3637ca5eae4ddda5bb969&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|enableFpid ||	Optional:turn on or off the First Party ID || Nielsen-specified || || &amp;quot;true&amp;quot; for turn on,  &amp;quot;false&amp;quot; for turn off. The default value is &amp;quot;true&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| nol_devDebug || Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|| Nielsen-specified ||  || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt; If the User consent changes while using the App, you have to delete the current SDK instance and create a new instance with the updated optout and enableFpid values. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) AppSDK() is no longer a singleton object and should be created as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
try{&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;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;hem_sha1&amp;quot;, &amp;quot;7ed2155ee9964d69ca425b0aceccda25d5462e06228a40d0da4dce5a4eb3e826&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;uid2&amp;quot;, &amp;quot;7b733f363eb756046bf72bf476d24611e931e763222a7e89537477261f7bae05&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;hem_sha256&amp;quot;, &amp;quot;0da83f9ab3bf59e3638f96d83409878fb507d3edd4d3637ca5eae4ddda5bb969&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;enableFpid&amp;quot;, &amp;quot;true&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, this);&lt;br /&gt;
}&lt;br /&gt;
catch (JSONException e){&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;
2) implement IAppNotifier into your activity like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public class MainActivity extends AppCompatActivity implements IAppNotifier&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3) implement callback&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;@Override&lt;br /&gt;
public void onAppSdkEvent(long timestamp, int code, String description){&lt;br /&gt;
  Log.d(TAG, &amp;quot;SDK callback onAppSdkEvent &amp;quot; + description);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So whole Activity will look like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.example.josefvancura.nlsdemotmp;&lt;br /&gt;
&lt;br /&gt;
import android.content.Context;&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;
&lt;br /&gt;
import com.nielsen.app.sdk.*;&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 MainActivity extends AppCompatActivity implements IAppNotifier {&lt;br /&gt;
&lt;br /&gt;
    private AppSdk mAppSdk = null;&lt;br /&gt;
    private String TAG = &amp;quot;MainActivity&amp;quot;;&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;
        Context context = getApplicationContext();&lt;br /&gt;
&lt;br /&gt;
        try{&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;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&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(context, appSdkConfig, this ); // Notifier - activity implements IAppNotifier, callback in onAppSdkEvent()&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        catch (JSONException e){&lt;br /&gt;
            Log.e(TAG, &amp;quot;Couldn’t prepare JSONObject for appSdkConfig&amp;quot;, e);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onAppSdkEvent(long timestamp, int code, String description) {&lt;br /&gt;
        Log.d(TAG, &amp;quot;SDK callback onAppSdkEvent &amp;quot; + description);&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;
==== Life cycle of SDK instance ====&lt;br /&gt;
Life cycle of SDK instance includes four general states:&lt;br /&gt;
# &amp;quot;&amp;quot;Initial state&amp;quot;&amp;quot; – 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 &amp;quot;&amp;quot;Initial state&amp;quot;&amp;quot;.&lt;br /&gt;
# &amp;quot;&amp;quot;Idle state&amp;quot;&amp;quot; – 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;
# &amp;quot;&amp;quot;Processing state&amp;quot;&amp;quot; – The SDK instance is processing playing information. API calls &amp;quot;play&amp;quot; and &amp;quot;loadMetadata&amp;quot; move the SDK instance into this state. In this state, the SDK instance will be able to process the API calls (see below)&lt;br /&gt;
# &amp;quot;&amp;quot;Disabled state&amp;quot;&amp;quot; – 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;
== Step 3: Create Metadata Objects ==&lt;br /&gt;
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, 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.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Create channelName 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;
&lt;br /&gt;
=== Create 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;
Note: All metadata values should be passed as UTF-8 strings.&lt;br /&gt;
&lt;br /&gt;
Please see the [[France SDK Metadata#Content Metadata|Mediametrie Content Metadata]] for the complete list of content metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MetaData Example ===&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;
   .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;assetid&amp;quot;, &amp;quot;unique_content_id&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;episode title&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;length&amp;quot;, &amp;quot;length in seconds&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;islivestn&amp;quot;, &amp;quot;y&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;subbrand&amp;quot;, &amp;quot;c05&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;cli_md&amp;quot;, &amp;quot;LIVE&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;cli_ch&amp;quot;, &amp;quot;860&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;cli_cn&amp;quot;, &amp;quot;customCuntentIdentifier&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_p0&amp;quot;, &amp;quot;p0,optionalValueP0&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_p1&amp;quot;, &amp;quot;p1,optionalValueP1&amp;quot;)&lt;br /&gt;
   // ...&lt;br /&gt;
   .put(&amp;quot;nol_p18&amp;quot;, &amp;quot;p18,optionalValueP18&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_p19&amp;quot;, &amp;quot;p19,optionaValuelP19&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Step 4: Start the Measurement ==&lt;br /&gt;
&lt;br /&gt;
=== Overview of SDK API Calls ===&lt;br /&gt;
&lt;br /&gt;
==== play ====&lt;br /&gt;
The play method prepares the SDK for reporting once an asset has loaded and playback has begun. Use play to pass the channel descriptor information through channelName parameter when the user taps the &amp;quot;&amp;quot;Play&amp;quot;&amp;quot; button on the player. Call play only when initially starting the video.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;mAppSdk.play(JSONObject channelInfo);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== loadMetadata ====&lt;br /&gt;
Needs to be called at the beginning of each asset, pass JSON object for relevant content. Make sure to pass as 1st loadMetadata for content at the begining of playlist - see below API call sequence examples.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;mAppSdk.loadMetadata(JSONObject contentMetadata);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== playheadPosition ====&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:#d0f6f8&amp;quot;&amp;gt;&lt;br /&gt;
Note: &amp;quot;setPlayheadPosition&amp;quot; has to be called every second and the value passed should match the broadcast time for live channel.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* VOD: current position in seconds. Pass whole number that increments only by 1 like 0,1,2,3... &amp;lt;br/&amp;gt;&lt;br /&gt;
* Live: Unix timestamp matching the broadcast time for Content (seconds since Jan-1-1970 UTC). Pass whole number that increments only by 1 like 1631098029,1631098030,1631098031,1631098032,... &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;mAppSdk.setPlayheadPosition(long videoPositon);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== stop ====&lt;br /&gt;
Call when&lt;br /&gt;
* when a user pauses playback&lt;br /&gt;
* when an Ad Break starts during the Content Playback&lt;br /&gt;
* upon any user interruption scenario - see bellow chapter Interruption scenario&lt;br /&gt;
&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;
Call when the content asset completes playback.  Stops measurement progress.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;mAppSdk.end();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Start the Measurement ===&lt;br /&gt;
In order to start the measurement, follow the 3 first steps below for Content without Ads. When terminating the Content playback call &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; to terminate the Content Measurement for the given asset.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | 1. Start of stream || &amp;lt;code&amp;gt;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;loadMetadata(contentMetadataObject)&amp;lt;/code&amp;gt; || contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| 2. Content is playing || &amp;lt;code&amp;gt;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;
| 3. End of Stream || &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; || Content playback is completed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Step 5: Stop/Resume the Measurement for video Playback Interruptions ==&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 &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; immediately (except when content is buffering) and withhold sending playhead position.&lt;br /&gt;
* Once the playback resumes, start sending pings &amp;lt;code&amp;gt;playheadPosition&amp;lt;/code&amp;gt; for the new viewing session.&lt;br /&gt;
Please see the [[Digital Measurement FAQ]] for more details&lt;br /&gt;
&lt;br /&gt;
== Step 6: Review SDK Integration Architecture Diagram ==&lt;br /&gt;
&lt;br /&gt;
=== For Content Playback ===&lt;br /&gt;
&lt;br /&gt;
[[File:nlsn-sdk-achitecture-diagram-content-fr.png||SDK Integration Architecture Diagram - Content]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Step 7 : Disclose Nielsen Privacy Statement ==&lt;br /&gt;
The App SDK uses Mobile Ad IDs (Android ID or IDFA) which are fully hashed on the device before being sent to Nielsen (Nielsen never receives un-hashed values).&lt;br /&gt;
Users retain the possibility to oppose the use of Mobile Ad IDs, or to reset them, by using the functionality provided by the mobile operating system (iOS or Android).&lt;br /&gt;
&lt;br /&gt;
In order to disclose Nielsen measurement privacy statement, please include the following items in your privacy policy:&lt;br /&gt;
* A notice that the player includes third party measurement software that allows users to contribute to market research.&lt;br /&gt;
* A link to the Nielsen Digital Measurement Privacy Policy located at https://www.nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/ .&lt;br /&gt;
&lt;br /&gt;
=== Initialization of the SDK based on User Consent in your App ===&lt;br /&gt;
&lt;br /&gt;
In collaboration with Mediametrie, the following user consent use cases need to be implemented in your App.&lt;br /&gt;
&lt;br /&gt;
==== The user explicitly accepts measurement ====&lt;br /&gt;
 The SDK is initialized and all IDs are captured. The SDK Opt-in Flags have to be set accordingly, see:&lt;br /&gt;
&lt;br /&gt;
* [[#User opted in|User opted in]]&lt;br /&gt;
* [[#First Party ID turned on|First Party ID turned on]]&lt;br /&gt;
&lt;br /&gt;
==== The user explicitly refuses measurement ====&lt;br /&gt;
The SDK is NOT initialized and No Nielsen SDK measurement will occur.&lt;br /&gt;
&lt;br /&gt;
==== The user did not explicitly give consent for the measurement(consent neither given nor refused) ====&lt;br /&gt;
 The SDK is initialized and no IDs are captured. The SDK Opt-out Flags have to be set accordingly, see:&lt;br /&gt;
* [[#User opted out|User opted out]]&lt;br /&gt;
* [[#First Party ID turned off|First Party ID turned off]]&lt;br /&gt;
&lt;br /&gt;
=== Turning off the First Party ID for Opt-out Users during the SDK Initializazion ===&lt;br /&gt;
The First Party ID(FPID) is enabled by default in the Browser SDK. For Opt-out users, the First Party ID can be turned off during the initialization of the SDK Instance, i.e. the parameter enableFpid can be set to &amp;quot;false&amp;quot; (FPID disabled) or &amp;quot;true&amp;quot; (FPID enabled). &lt;br /&gt;
&lt;br /&gt;
===== Example of SDK Initialization with enableFpid =====&lt;br /&gt;
&lt;br /&gt;
====== First Party ID turned on ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
try{&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;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;enableFpid&amp;quot;, &amp;quot;true&amp;quot;)&lt;br /&gt;
          // ...&lt;br /&gt;
         // Pass appSdkConfig to the AppSdk constructor&lt;br /&gt;
         mAppSdk = new AppSdk(appContext, appSdkConfig, this);&lt;br /&gt;
}&lt;br /&gt;
catch (JSONException e){&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;
====== First Party ID turned off ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
try{&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;PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;enableFpid&amp;quot;, &amp;quot;false&amp;quot;)&lt;br /&gt;
          // ...&lt;br /&gt;
         // Pass appSdkConfig to the AppSdk constructor&lt;br /&gt;
         mAppSdk = new AppSdk(appContext, appSdkConfig, this);&lt;br /&gt;
}&lt;br /&gt;
catch (JSONException e){&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;
=== Setting the  SDK global optout Flag for Opt-out Users  ===&lt;br /&gt;
The Optoout Flag is set by default to &amp;quot;false&amp;quot; in the AppSDK SDK. For Opt-out users, the Optout Flag can be set. Immediately after creating the AppSDK Instance, set the Optout Flag using the userOptOut AppSDK API.&lt;br /&gt;
&lt;br /&gt;
===== Example the Ouptout Flag =====&lt;br /&gt;
&lt;br /&gt;
====== User opted out ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
appSdk.userOptOut(&amp;quot;nielsenappsdk://1&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== User opted in======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
appSdk.userOptOut(&amp;quot;nielsenappsdk://0&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 8 : Review the Reference Implementation for VoD and Live Streams ==&lt;br /&gt;
&lt;br /&gt;
The Reference Implementation covers VoD and Live use cases. &lt;br /&gt;
The code also covers also DAI (Dynamic Ad Insertion)  that should be ignored since No Ads are measured in France.&lt;br /&gt;
&lt;br /&gt;
Download the Reference Implementation for Android [https://nielsenonlinesupport.com/dk/android/DKRefPLAYER.zip DKRefPLAYER].&lt;br /&gt;
Unzip and open the project in Android Studio, then run it i.e. in the simulator or on Android device and then filter the Logcat output with &amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;quot; in order to see only relevant Nielsen SDK API Calls, as below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
2021-04-08 15:11:27.075  D/NielsenInit: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL : class NielsenInit :: Create new AppSdk() Instance.&lt;br /&gt;
2021-04-08 15:11:27.568  D/NielsenInit: ====&amp;gt;&amp;gt;&amp;gt; SDK EVENT - onAppSdkEvent: Description = Nielsen App SDK is initiated. AppSdk.jar aa.8.0.0.0_gsxaon. App SDK was successfully initiatedCode l param : 1617887487Code i param 2000&lt;br /&gt;
2021-04-08 15:11:29.497  D/NielsenInit: ====&amp;gt;&amp;gt;&amp;gt; SDK EVENT - onAppSdkEvent: Description = Nielsen App SDK has started up. AppSdk.jar aa.8.0.0.0_gsxaon. Config file successfully loaded and parsed.Code l param : 1617887489Code i param 2001&lt;br /&gt;
2021-04-08 15:11:42.736  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL :  appSdk.play(sdkMethods.loadChannelInfo());&lt;br /&gt;
2021-04-08 15:11:42.738  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL : onPrepared() : appSdk.loadMetadata(data)&lt;br /&gt;
2021-04-08 15:11:43.065  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; Media Player Event : onInfo ();what = 3&lt;br /&gt;
2021-04-08 15:11:43.065  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; Media Player Event :  first video frame pushed for rendering.&lt;br /&gt;
2021-04-08 15:11:43.747  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL :   appSdk.setPlayheadPosition(mCurrentPosition): @ 0 / 224&lt;br /&gt;
2021-04-08 15:11:44.752  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL :   appSdk.setPlayheadPosition(mCurrentPosition): @ 1 / 224&lt;br /&gt;
2021-04-08 15:11:45.759  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL :   appSdk.setPlayheadPosition(mCurrentPosition): @ 2 / 224&lt;br /&gt;
2021-04-08 15:11:46.764  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL :   appSdk.setPlayheadPosition(mCurrentPosition): @ 3 / 224&lt;br /&gt;
2021-04-08 15:11:47.767  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL :   appSdk.setPlayheadPosition(mCurrentPosition): @ 4 / 224&lt;br /&gt;
2021-04-08 15:11:48.772  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL :   appSdk.setPlayheadPosition(mCurrentPosition): @ 5 / 224&lt;br /&gt;
2021-04-08 15:11:49.777  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL :   appSdk.setPlayheadPosition(mCurrentPosition): @ 6 / 224&lt;br /&gt;
2021-04-08 15:11:50.781  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL :   appSdk.setPlayheadPosition(mCurrentPosition): @ 7 / 224&lt;br /&gt;
2021-04-08 15:11:51.819  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL :   appSdk.setPlayheadPosition(mCurrentPosition): @ 8 / 224&lt;br /&gt;
2021-04-08 15:11:51.821  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; Activity onPause()&lt;br /&gt;
2021-04-08 15:11:52.668  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt;: Activity onDestroy()&lt;br /&gt;
2021-04-08 15:11:52.668  D/MainActivity: ====&amp;gt;&amp;gt;&amp;gt; SDK CALL : terminateNielsenSDK () :appSdk.end();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 9 :  Test your player by yourself ==&lt;br /&gt;
=== Guide ===&lt;br /&gt;
1. Connect your PC and test device (tablet or phone) via same router.&amp;lt;br /&amp;gt;&lt;br /&gt;
2. PC side: run Proxy sw (like Charles) and get local IP&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Test device: modify Wifi setting to pass through Proxy IP from step 2.&amp;lt;br /&amp;gt;&lt;br /&gt;
4. Test device: run your player, launch video&amp;lt;br /&amp;gt;&lt;br /&gt;
5. PC side: filter traffic by &amp;quot;nmr&amp;quot; and confirm presence of GN pings&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example of GN ping ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://secure-fr.nmrodam.com/cgi-bin/gn?prd=dcr&amp;amp;ci=us-500207&amp;amp;ch=us-500207_c77_P&amp;amp;asn=defChnAsset&amp;amp;fp_id=&amp;amp;fp_cr_tm=&amp;amp;fp_acc_tm=&amp;amp;fp_emm_tm=&amp;amp;ve_id=&amp;amp;devmodel=&amp;amp;manuf=&amp;amp;sysname=&amp;amp;sysversion=&amp;amp;sessionId=zlmmxkq867zt4bpnumlyz6dpn9hyp1610980356&amp;amp;tl=Episode%201&amp;amp;prv=1&amp;amp;c6=vc%2Cc77&amp;amp;ca=us-500207_c77_VID5556674-123456&amp;amp;cg=TAMSample%20DK&amp;amp;c13=asid%2CP10DF14BA-937E-436D-99DF-ED39A0422387&amp;amp;c32=segA%2CNA&amp;amp;c33=segB%2CNA&amp;amp;c34=segC%2CNA&amp;amp;c15=apn%2C&amp;amp;plugv=&amp;amp;playerv=&amp;amp;sup=1&amp;amp;segment2=&amp;amp;segment1=&amp;amp;forward=0&amp;amp;ad=0&amp;amp;cr=4_00_99_V1_00000&amp;amp;c9=devid%2C&amp;amp;enc=true&amp;amp;c1=nuid%2C999&amp;amp;at=view&amp;amp;rt=video&amp;amp;c16=sdkv%2Cbj.6.0.0&amp;amp;c27=cln%2C0&amp;amp;crs=&amp;amp;lat=&amp;amp;lon=&amp;amp;c29=plid%2C16109803568088038&amp;amp;c30=bldv%2C6.0.0.563&amp;amp;st=dcr&amp;amp;c7=osgrp%2C&amp;amp;c8=devgrp%2C&amp;amp;c10=plt%2C&amp;amp;c40=adbid%2C&amp;amp;c14=osver%2CNA&amp;amp;c26=dmap%2C1&amp;amp;dd=&amp;amp;hrd=&amp;amp;wkd=&amp;amp;c35=adrsid%2C&amp;amp;c36=cref1%2C&amp;amp;c37=cref2%2C&amp;amp;c11=agg%2C1&amp;amp;c12=apv%2C&amp;amp;c51=adl%2C0&amp;amp;c52=noad%2C0&amp;amp;sd=170&amp;amp;devtypid=&amp;amp;pc=NA&amp;amp;c53=fef%2Cy&amp;amp;c54=oad%2C20200713%2010%3A22%3A00&amp;amp;c55=cref3%2C&amp;amp;c57=adldf%2C2&amp;amp;ai=VID5556674-123456&amp;amp;c3=st%2Cc&amp;amp;c64=starttm%2C1610980392&amp;amp;adid=VID5556674-123456&amp;amp;c58=isLive%2Cfalse&amp;amp;c59=sesid%2Cgezrb92q4i9b9jg7acxgn783gjw0a1610980365&amp;amp;c61=createtm%2C1610980392&amp;amp;c63=pipMode%2C&amp;amp;c68=bndlid%2C&amp;amp;nodeTM=&amp;amp;logTM=&amp;amp;c73=phtype%2C&amp;amp;c74=dvcnm%2C&amp;amp;c76=adbsnid%2C&amp;amp;c77=adsuprt%2C2&amp;amp;uoo=&amp;amp;evdata=&amp;amp;c71=ottflg%2C0&amp;amp;c72=otttyp%2Cnone&amp;amp;c44=progen%2C&amp;amp;davty=0&amp;amp;si=http%3A%2F%2Fnielsenonlinesupport.com%2Fdk%2Findex.htm&amp;amp;c66=mediaurl%2Cassets%252FRTVOD_C3%252Fprog_index.m3u8&amp;amp;c62=sendTime%2C1610980392&amp;amp;rnd=714644&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 10 :  Provide your app for certification ==&lt;br /&gt;
Once ready, please send a request (https://portail-marqueurs.mediametrie.com) to Médiamétrie local staff for certification.&lt;br /&gt;
&lt;br /&gt;
== Step 11 :  Going Live ==&lt;br /&gt;
After the integration has been certified (but not prior that), disable debug logging by deleting {nol_devDebug: &amp;quot;DEBUG&amp;quot;} from initialization call - see Step 2.&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Template:DCR_Content_Metadata&amp;diff=6599</id>
		<title>Template:DCR Content Metadata</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Template:DCR_Content_Metadata&amp;diff=6599"/>
		<updated>2024-04-09T22:38:16Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! '''Keys''' !! '''Description''' !! '''Values''' !! '''Required'''!!'''Provider'''&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset ||For Video use: &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; For Static or text &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt; || Yes || Nielsen&lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| assetid || Unique ID assigned to asset &amp;lt;br&amp;gt; Note: Refrain from using the following special characters [[Special_Characters|(Special Characters)]]. || Examples: &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;BBT345a234 &amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;CBSs5e234F2021&amp;lt;/code&amp;gt;  || Yes || Client &lt;br /&gt;
|-&lt;br /&gt;
| program ||Complete program or movie title &amp;lt;br&amp;gt; (no abbreviations or shorthand) &amp;lt;br&amp;gt; Note: there is a 25 character limit.  ||&amp;lt;code&amp;gt; The Big Bang Theory&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt; TheBigBangTheory&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&amp;lt;code&amp;gt; The Dark Knight&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&amp;lt;code&amp;gt; TheDarkKnight&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; || Yes || Client &lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| title ||Episode title with season and episode number (40 character limit) &amp;lt;br&amp;gt; (Formats accepted: S01E03, S1E3, S1 E3). || Examples: &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;The Pants Alternative S03E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;The Pants Alternative S3E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;The Pants Alternative S3 E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; Can also accept: &amp;lt;code&amp;gt; S3E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; Not Valid: &amp;lt;code&amp;gt; 318 &amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt; 0318 &amp;lt;/code&amp;gt;|| Yes || Client &lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Gracenote TMS ID (If available) should be passed for all telecasted content for clients using the Gracenote solution for proper matching purposes. &amp;lt;br&amp;gt;Note: The TMS ID will be a 14 character string. Normally leading with 2 alpha characters ('EP', 'MV', 'SH' or 'SP'), followed by 12 numbers.&lt;br /&gt;
|| The TMS ID will be a 14 character string. &amp;lt;br&amp;gt; Normally being with  'EV,' 'EP', 'SH', 'SP', or 'MV' &amp;lt;br&amp;gt; Followed by 12 numbers after the initial two letter prefix. &amp;lt;br&amp;gt; &amp;lt;br&amp;gt; The Giant Morning Show: &amp;lt;code&amp;gt;SH009311820022&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; The Pants Alternative Episode : &amp;lt;code&amp;gt;EP009311820061&amp;lt;/code&amp;gt; || Optional || Nielsen&lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| crossId2 || Populated by content distributor to contribute viewing from that distributor to the given content originator. || Custom&amp;lt;br&amp;gt;For a full list of acceptable values, please contact your Nielsen reprentative. || Yes, for distributors || Nielsen&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds&amp;lt;br&amp;gt;Note: Integers and decimal values are acceptable for the length parameter. || Examples:&lt;br /&gt;
&amp;lt;small&amp;gt;For standard VOD content - &amp;lt;code&amp;gt;300&amp;lt;/code&amp;gt; to represent 5 minutes, &amp;lt;code&amp;gt;1320&amp;lt;/code&amp;gt; to represent 22 minutes, etc.&lt;br /&gt;
&amp;lt;br&amp;gt;If DAI live stream of a discrete program (Live Event/Sporting Event), pass length of content. See example for standard VOD content above.&lt;br /&gt;
&amp;lt;br&amp;gt;If unknown DAI live steam, pass a value of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/small&amp;gt; &lt;br /&gt;
|| Yes || Client &lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| airdate ||Original broadcast or release date for the program &amp;lt;br&amp;gt;For USA, date should be EST &amp;lt;br&amp;gt; Outside USA, date should be local time.&amp;lt;br&amp;gt;If not applicable or available, original broadcast or release date for the Program. || Acceptable Formats:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDTHH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDHH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDTHH:MI:SS+xx:xx&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDTHH:MI:SS-xx:xx&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYYMMDDHH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYYMMDD HH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;MM-DD-YYYY&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;MM/DD/YYYY&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYYMMDD&amp;lt;/code&amp;gt;&amp;lt;/big&amp;gt; || Yes || Client &lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag to identify differences between long form content. || &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;- non full episode(clip,teaser,promo,etc.)&lt;br /&gt;
&amp;lt;small&amp;gt;Also accept: &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;lf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;- longform&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;- shortform&lt;br /&gt;
|| Yes || Nielsen&lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| adloadtype || &amp;lt;big&amp;gt;&amp;lt;small&amp;gt;Type of ad load: &lt;br /&gt;
&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; Linear – matches TV ad load&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; Dynamic – Dynamic Ad Insertion (DAI)&amp;lt;/small&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
|| &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - DCR measures content with dynamic ads || Yes || Nielsen&lt;br /&gt;
|-&lt;br /&gt;
| segB || One of two custom segment for the clients granular reporting within a brand. || Examples:&amp;lt;br&amp;gt;Genre - &amp;lt;code&amp;gt;horror&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comedy&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;Timeslot - &amp;lt;code&amp;gt;primetime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;daytime&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;News type - &amp;lt;code&amp;gt;breakingnews&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;weather&amp;lt;/code&amp;gt;, etc. || Optional || Client &lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| segC || One of two custom segment for the clients granular reporting within a brand. || Examples:&amp;lt;br&amp;gt;Genre - &amp;lt;code&amp;gt;horror&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comedy&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;Timeslot - &amp;lt;code&amp;gt;primetime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;daytime&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;News type - &amp;lt;code&amp;gt;breakingnews&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;weather&amp;lt;/code&amp;gt;, etc. || Optional || Client &lt;br /&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.&lt;br /&gt;
&lt;br /&gt;
Examples regarding usage of segments within SDK:&lt;br /&gt;
* All comedy clips and stories for a Brand rolled into a &amp;quot;Comedy&amp;quot; segment&lt;br /&gt;
* genre grouping content by Comedy vs. Drama&lt;br /&gt;
* group related Text + Video content - i.e. for a show that has a lot of - static pages associated with it&lt;br /&gt;
* packaging based on how clients sell inventory&lt;br /&gt;
* grouping related types of content either by genre, category or platform.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DCR_Germany_Video_Cloud_API&amp;diff=6598</id>
		<title>DCR Germany Video Cloud API</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DCR_Germany_Video_Cloud_API&amp;diff=6598"/>
		<updated>2024-04-09T22:35:32Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|AGF Implementation Documentation}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
= DCR Integration Utilizing Cloud API =&lt;br /&gt;
This guide shows you how to integrate the Nielsen Cloud API to enable Digital Content Ratings (DCR), and fuel other measurement products on your over-the-top (OTT) Apps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: orange&amp;quot;&amp;gt;&lt;br /&gt;
PLease note that you have to use the Staging Cloud API Endpoint until you get the green light from Nielsen to move to Production!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get started, you will need a Nielsen App ID. The App ID is a unique ID assigned to your app. This will be provided to you by your assigned Technical Account Manager upon starting the integration.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
 || '''App ID (appid)''' || Unique ID assigned to the player/site and configured by product. || Provided by Nielsen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Integration==&lt;br /&gt;
We will cover the steps for constructing the Cloud API Calls.&lt;br /&gt;
&lt;br /&gt;
====URL Structure====&lt;br /&gt;
&lt;br /&gt;
The Cloud API Calls are HTTP GET Requests with the URL structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;[endpoint]/[appid]/[sessionID]/a?b=[payload]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The URL includes the following components:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;[endpoint]&amp;lt;/code&amp;gt;: location of data collection environment&lt;br /&gt;
*&amp;lt;code&amp;gt;[appid]&amp;lt;/code&amp;gt;: provided App ID. &amp;lt;br&amp;gt;'''Note:'''The &amp;quot;P&amp;quot; prefix must be removed from the App ID received before adding it to the URL, i.e. if you received PDF20695-XXXX-XXXX-XXXX-3E334133D917 from Nielsen , your url will then be : &amp;lt;code&amp;gt;[endpoint]/DF20695-XXXX-XXXX-XXXX-3E334133D917/[sessionID]/a?b=[payload]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt;: unique value for each user session&lt;br /&gt;
*&amp;lt;code&amp;gt;[payload]&amp;lt;/code&amp;gt;: metadata and events&lt;br /&gt;
&lt;br /&gt;
====Endpoint====&lt;br /&gt;
&lt;br /&gt;
There are endpoints for testing and production:&lt;br /&gt;
&lt;br /&gt;
*Testing: &amp;lt;code&amp;gt;https://sc-eucert.nmrodam.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
During testing, all calls should be pointed to the testing endpoint. We will review the update to the production endpoint during the Go Live section of this guide.&lt;br /&gt;
&lt;br /&gt;
====URL Example====&lt;br /&gt;
As you move through the integration steps, you can reference the below URL structure with the expanded payload:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
https://sc-eucert.nmrodam.com/nmapi/v2/[appid]/[sessionID]/a?b=&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;devInfo&amp;quot;: [deviceInfo],&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;content&amp;quot;: [content_metadata],&lt;br /&gt;
    &amp;quot;ad&amp;quot;: [ad metadata]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;event&amp;quot;: [event],&lt;br /&gt;
  &amp;quot;position&amp;quot;: [playhead_position],&lt;br /&gt;
  &amp;quot;type&amp;quot;: [asset type],&lt;br /&gt;
  &amp;quot;utc&amp;quot;: [Unix time in ms],&lt;br /&gt;
  &amp;quot;sessid&amp;quot;: [unique view session ID for each video play]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Create Session ID and send EMM Ping===&lt;br /&gt;
&lt;br /&gt;
====Create Session ID====&lt;br /&gt;
&lt;br /&gt;
A unique Session ID &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt; must be created upon app launch and provided in the URL. This will allow the measurement to occur for the entire duration that a user is within the app.&lt;br /&gt;
&lt;br /&gt;
A Session ID needs to be completely unique so it is recommended to use our generation method example provided below to create unique alpha-numerical 29 characters + 10 characters UTC timestamp, to guarantee there are no repeats, also see [[#Review the Reference Implementation for VoD and Live Streams|Reference Implementation for VoD and Live Streams]] for your reference and use.&lt;br /&gt;
&lt;br /&gt;
Session ID example: '''LsTYTmZQPwdchsNZkdtJp9lErjgAp1632729088'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
'''// Create random GUID'''&lt;br /&gt;
function buildGUID() {&lt;br /&gt;
    var UAIDbase62Characters = &amp;quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
    var UAIDpayloadLength = 29;&lt;br /&gt;
&lt;br /&gt;
    function UAIDgetRandom62() {&lt;br /&gt;
        var r1;&lt;br /&gt;
        do {&lt;br /&gt;
            r1 = Math.floor(Math.random() * (16 * 62));&lt;br /&gt;
        } while (r1 &amp;gt; 61); &lt;br /&gt;
        return r1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var uid = '';&lt;br /&gt;
    for (var a = 0; a &amp;lt; UAIDpayloadLength; a++) {&lt;br /&gt;
        uid += UAIDbase62Characters.charAt(UAIDgetRandom62());&lt;br /&gt;
    }&lt;br /&gt;
    var timestamp_ms = new Date().getTime();&lt;br /&gt;
    uid += String(timestamp_ms).substring(3);&lt;br /&gt;
    return uid;&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;
Upon exiting the app, the session will need to be terminated using the delete event. &amp;lt;br&amp;gt;&lt;br /&gt;
Sessions will automatically expire after 30 minutes of cloud inactivity.&lt;br /&gt;
&lt;br /&gt;
==== Send EMM Ping ====&lt;br /&gt;
An EMM Ping must be sent using the created unique Session ID &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt; upon start of the first stream playback.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
https://[sessionID].uaid.nmrodam.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Also see  [[#Review the Reference Implementation for VoD and Live Streams|Reference Implementation for VoD and Live Streams]] for your reference.&lt;br /&gt;
&lt;br /&gt;
===Create View Session ID for each Video Start===&lt;br /&gt;
An View Session ID &amp;lt;code&amp;gt;[sessid]&amp;lt;/code&amp;gt; must be created upon start of each stream playback, sessid is unique per video play.&lt;br /&gt;
&lt;br /&gt;
===Define URL Structure===&lt;br /&gt;
Define the URL structure using your provided &amp;lt;code&amp;gt;[appid]&amp;lt;/code&amp;gt; and a unique &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;https://sc-eucert.nmrodam.com/nmapi/v2/[appid]/[sessionID]/a?b=[payload]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configure Payload===&lt;br /&gt;
&lt;br /&gt;
====Description Payload====&lt;br /&gt;
&lt;br /&gt;
All Cloud API requests must contain the following payload data:&lt;br /&gt;
&lt;br /&gt;
*''devInfo'': device and app info&lt;br /&gt;
*''metadata'': asset metadata&lt;br /&gt;
*''event metadata'': type of event&lt;br /&gt;
&lt;br /&gt;
The payload can be passed through key-values using the Nielsen reserved keys. The specific keys and descriptions are highlighted in the tables included in this section.&lt;br /&gt;
&lt;br /&gt;
==== Payload Example ====&lt;br /&gt;
&lt;br /&gt;
The example below should be referenced when following the steps for configuring the request payload.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Create Session ID using the UUID Generator code provided&lt;br /&gt;
sessionID = LsTYTmZQPwdchsNZkdtJp9lErjgAp1632729088  // Example sessionID &lt;br /&gt;
&lt;br /&gt;
// 2. Define URL Structure with App ID and Session ID&lt;br /&gt;
sessionURL = https://sc-eucert.nmrodam.com/nmapi/v2/[appid]/[sessionID]/a?b=&lt;br /&gt;
&lt;br /&gt;
// 3. Configure Payload&lt;br /&gt;
// 3.1 Configure Payload: devInfo &lt;br /&gt;
payload = {&lt;br /&gt;
 &amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
   &amp;quot;devId&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;apn&amp;quot;: &amp;quot;AppName&amp;quot;,&lt;br /&gt;
   &amp;quot;apv&amp;quot;: &amp;quot;1.0&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  // 3.2 Configure Payload: metadata&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;content&amp;quot;: { // object for measuring video content&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;program&amp;quot;: &amp;quot;Program Name&amp;quot;,&lt;br /&gt;
      &amp;quot;title&amp;quot;: &amp;quot;episode title&amp;quot;,&lt;br /&gt;
      &amp;quot;length&amp;quot;: &amp;quot;3600&amp;quot;,&lt;br /&gt;
  	  // custom metadata&lt;br /&gt;
      &amp;quot;nol_c0&amp;quot;: &amp;quot;p0,1&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c2&amp;quot;: &amp;quot;p2,Y&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c7&amp;quot;: &amp;quot;p7,videoid123&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c8&amp;quot;: &amp;quot;p8,&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c9&amp;quot;: &amp;quot;p9,VideoTitle123&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c10&amp;quot;: &amp;quot;p10,clientname&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c12&amp;quot;: &amp;quot;p12,content&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c18&amp;quot;: &amp;quot;p18,N&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;ad&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
      &amp;quot;assetid&amp;quot;: &amp;quot;ad345-67483&amp;quot;,&lt;br /&gt;
      &amp;quot;title&amp;quot;: &amp;quot;ad_title&amp;quot;,&lt;br /&gt;
      &amp;quot;length&amp;quot;: &amp;quot;25&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c8&amp;quot;: &amp;quot;p8,&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c10&amp;quot;: &amp;quot;p10,clientname&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c11&amp;quot;: &amp;quot;p11,2352723141&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c12&amp;quot;: &amp;quot;p12,Werbung&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c17&amp;quot;: &amp;quot;p17,preroll&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
    &lt;br /&gt;
  // 3.3 Configure Payload: events&lt;br /&gt;
  &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, //event name&lt;br /&gt;
  &amp;quot;position&amp;quot;: &amp;quot;300&amp;quot;, // position in seconds&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, //&amp;quot;content&amp;quot; or &amp;quot;ad&amp;quot;&lt;br /&gt;
  &amp;quot;utc&amp;quot;: &amp;quot;1456448742000&amp;quot;, //unix timestamp in milliseconds &lt;br /&gt;
  &amp;quot;sessid&amp;quot;: &amp;quot;xxxjavd6wzirm93xb95uxjy1ac5wu1627638609&amp;quot; // create and pass a unique sessid for each video play using UUID Generator code provided&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Configure Payload: devInfo====&lt;br /&gt;
An object &amp;lt;code&amp;gt;&amp;quot;devInfo&amp;quot;&amp;lt;/code&amp;gt; will need to be created to capture App and Device information.&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;
| devId || unique ID to identify user (e.g. Advertising ID, Roku Device ID) - Not required for AGF || custom || &lt;br /&gt;
|-&lt;br /&gt;
| apn || app name || custom || ✓&lt;br /&gt;
|-&lt;br /&gt;
| apv || app build version || custom || ✓&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Example devInfo Object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// create devInfo object&lt;br /&gt;
&amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
  &amp;quot;devId&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;apn&amp;quot;: &amp;quot;AppName&amp;quot;,&lt;br /&gt;
  &amp;quot;apv&amp;quot;: &amp;quot;1.0&amp;quot;&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 Configure Payload: metadata ====&lt;br /&gt;
Asset metadata can be passed through &amp;lt;code&amp;gt;&amp;quot;metadata&amp;quot;&amp;lt;/code&amp;gt;. There are two asset types: &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; for video and &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; for ads. The metadata received for each asset is used for classification and reporting.&lt;br /&gt;
&lt;br /&gt;
You will need to set up &amp;lt;code&amp;gt;&amp;quot;metadata&amp;quot;&amp;lt;/code&amp;gt; objects for &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
&lt;br /&gt;
===== Content Metadata =====&lt;br /&gt;
&lt;br /&gt;
====== Description of 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;
For detailed information on metadata and custom variables, see '''[[AGF Metadata Convention#Video Measurement|AGF Metadata Convention for Video Measurement]]'''&lt;br /&gt;
&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;
| assetid || unique ID assigned to asset (64 character limit; only characters 0-9, a-z, A-Z underscore and minus are allowed - no special characters or vowel mutations)|| custom (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 - no backslash allowed in string (because of 3rd party data processing) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| length || length of content in seconds || &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; ('86400' for 24/7 Livestream. For Event-Livestreams planned length. For VoD video length) || ✓&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 with 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)&lt;br /&gt;
||&lt;br /&gt;
provided by Nielsen	&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| nol_c0  || number of episode part (Sendungsteilenummer)              || number                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c2  || web only                     || 'Y' or 'N'          || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c5  || page URL                     || custom                ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c7  || Video ID                     || custom                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c8  || not in use         		  || leave blank, reserved for AGF || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c9  || episode title                || custom - no backslash allowed in string (because of 3rd party data processing) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c10 || publisher                    || custom                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c12 || type of asset                || 'Trailer' or 'Content'             || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c13 || custom variable              || custom ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c14 || not in use         		  || leave blank, reserved for AGF || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c15 || format ID                    || custom                ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c16 || content-ID (Combines different videos to a common category, content-wise, a content-ID is available for content, trailer and ads) || custom, i.e. 'dVxRcCpOqKyFz02fuss', 'dvrsowf_ten_rtlibes', etc ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c18 || livestream                   || 'Y' or 'N' || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c19 || custom variable              || custom                ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c20 || GfK-ID                     || custom                ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Example Content metadata ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang='json'&amp;gt;// create content object&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;assetid&amp;quot;: &amp;quot;88675545&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;episode title&amp;quot;,&lt;br /&gt;
      &amp;quot;length&amp;quot;: &amp;quot;3600&amp;quot;,&lt;br /&gt;
  	  // custom metadata&lt;br /&gt;
      &amp;quot;nol_c0&amp;quot;: &amp;quot;p0,1&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c2&amp;quot;: &amp;quot;p2,Y&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c7&amp;quot;: &amp;quot;p7,videoid123&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c8&amp;quot;: &amp;quot;p8,&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c9&amp;quot;: &amp;quot;p9,VideoTitle123&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c10&amp;quot;: &amp;quot;p10,clientname&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c12&amp;quot;: &amp;quot;p12,content&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c18&amp;quot;: &amp;quot;p18,N&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Ad Metadata (optional for public broadcasters) =====&lt;br /&gt;
====== Description of 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;
For detailed information on metadata and custom variables, see '''[[AGF Metadata Convention#Video Measurement|AGF Metadata Convention for Video Measurement]]'''&lt;br /&gt;
&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 asset (64 character limit; only characters 0-9, a-z, A-Z underscore and minus are allowed - no special characters or vowel mutations)|| custom (no SPACE - no [https://engineeringportal.nielsen.com/docs/Special_Characters Special Characters]) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| subbrand	|| vcid/sub-brand ID – value is automatically populated through provided App ID. In order to override the sub-brand configured to the App ID, value can be passed here (e.g. multiple sub-brands in App) || provided by Nielsen	||&lt;br /&gt;
|-&lt;br /&gt;
| title || only the AD-ID is necessary || custom, &amp;lt;AD-ID&amp;gt; without &amp;quot;VAST&amp;quot; Prefix or other, i.e.  '2352723141' ||	✓&lt;br /&gt;
|-	&lt;br /&gt;
| length || length of Ad in seconds || length of Ad in seconds || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c1 || universal AdID (Additional AD-ID to be used by second or third marketers) || custom, i.e. 'adgapid_022_800160_1601097_001_0_0' ||&lt;br /&gt;
|-&lt;br /&gt;
| nol_c2  || web only                     || 'Y' or 'N'          || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c4 || form of advertising || 'preroll','midroll', 'postroll', 'pre-split', 'sponsor' ||	&lt;br /&gt;
|-&lt;br /&gt;
| nol_c8  || not in use         		  || leave blank, reserved for AGF || &lt;br /&gt;
|-&lt;br /&gt;
| nol_c10 || publisher                    || custom                || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c11 || AD-ID (unique ID of an advertisement. Necessary if ads are being broadcasted) || custom, i.e. '2352723141' || ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c12 || content type (key distinction of content, advertising, and Trailer) || 'Werbung' ||  ✓&lt;br /&gt;
|-&lt;br /&gt;
| nol_c16 || content-ID (Combines different videos to a common category, content-wise, a content-ID is available for content, trailer and ads) || custom, i.e. 'dVxRcCpOqKyFz02fuss', 'dvrsowf_ten_rtlibes', etc ||	&lt;br /&gt;
|-&lt;br /&gt;
| nol_c17 || ad placement type (placement information of advertisement) || 'preroll', 'midroll', 'postroll' or 'other' ||	✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== Example Ad metadata ======&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// create ad object&lt;br /&gt;
&amp;quot;ad&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
      &amp;quot;assetid&amp;quot;: &amp;quot;ad345-67483&amp;quot;,&lt;br /&gt;
      &amp;quot;title&amp;quot;: &amp;quot;ad_title&amp;quot;,&lt;br /&gt;
      &amp;quot;length&amp;quot;: &amp;quot;25&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c8&amp;quot;: &amp;quot;p8,&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c10&amp;quot;: &amp;quot;p10,clientname&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c11&amp;quot;: &amp;quot;p11,2352723141&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c12&amp;quot;: &amp;quot;p12,Werbung&amp;quot;,&lt;br /&gt;
      &amp;quot;nol_c17&amp;quot;: &amp;quot;p17,preroll&amp;quot;      &lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configure Payload: Events ====&lt;br /&gt;
&lt;br /&gt;
The last part of the payload is for enabling events so content is measured correctly when viewed. The events and required parameters are included below.&lt;br /&gt;
&lt;br /&gt;
===== Event Types =====&lt;br /&gt;
&lt;br /&gt;
The available events are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt; || &lt;br /&gt;
&lt;br /&gt;
===== Handling Playhead =====&lt;br /&gt;
&lt;br /&gt;
Calling &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt; is critical for accurate duration crediting. You can reference the below guidance to determine the correct playhead position to pass depending on the playback scenario.&lt;br /&gt;
&lt;br /&gt;
'''General'''&lt;br /&gt;
* Playhead position in seconds, must be passed as a whole number every 10 seconds. &lt;br /&gt;
* The final playhead position should be sent before before sending &amp;quot;complete&amp;quot; event when content playback is complete. &lt;br /&gt;
&lt;br /&gt;
'''Live Stream'''&lt;br /&gt;
* For Live streams, use Unix Time (in seconds) matching the broadcast time as the playhead position. Note that ad playheads must also use Unix Time for each single Ad in an Ad Pod.&lt;br /&gt;
&lt;br /&gt;
'''VoD Stream'''&lt;br /&gt;
* For VoD stream use the player position for Content and Ad at playback start of a content or single Ad in an Ad Pod, playheads will then be 0, 10, 20, ....&lt;br /&gt;
&lt;br /&gt;
'''End of an Asset'''&lt;br /&gt;
* Final postion must be sent at the end of Content or Ad playback&lt;br /&gt;
&lt;br /&gt;
'''Ads'''&lt;br /&gt;
* The final playhead position must be sent when switching from content to ad, or ad to content.&lt;br /&gt;
* For Ad Pods, playhead must be called for each individual ad.&lt;br /&gt;
* When content has resumed following a mid-roll ad break, the next playhead position must continue where the previous content segment left off.&lt;br /&gt;
&lt;br /&gt;
'''User Actions'''&lt;br /&gt;
* SCRUBBING: Upon user scrubbing, the current position must be sent before a user scrubs, and the new position should be sent where the user lands, and begin sending in the 10 second updates thereafter.&lt;br /&gt;
* PAUSE: When content is paused, send current playhead position and stop passing playhead position until content is resumed.&lt;br /&gt;
* EXIT Stream: If a user exits a stream early, the last current position must be sent in a playhead update to receive accurate duration.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;complete&amp;quot;&amp;lt;/code&amp;gt; || The complete event must be sent when the content has completed full playback. Before calling the complete event, a final playhead update with the final position is required to be sent to receive full duration credit. For Live streams, a complete event must be sent at program boundaries.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;delete&amp;quot;&amp;lt;/code&amp;gt; || The delete event is optional and can be sent when the viewing session is terminated (typically on App close). A new session ID must be generated after sending a delete event. Delete should not be sent on app interruptions or foreground/background events. All creditable duration will be summarized for all asset types when delete occurs (content and ads).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Event Parameters =====&lt;br /&gt;
&lt;br /&gt;
The following parameters need to be passed when calling events:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Description !! Value !! Required&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;event&amp;quot;&amp;lt;/code&amp;gt; || event type || &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;complete&amp;quot;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;delete&amp;quot;&amp;lt;/code&amp;gt; || ✓&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;position&amp;quot;&amp;lt;/code&amp;gt; || playhead position in seconds or Unix time in seconds || &amp;lt;code&amp;gt;&amp;quot;300&amp;quot;&amp;lt;/code&amp;gt; || ✓&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;type&amp;quot;&amp;lt;/code&amp;gt; || asset type || &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; || ✓&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;utc&amp;quot;&amp;lt;/code&amp;gt; || Unix timestamp in milliseconds. Must be passed every 10 seconds. || &amp;lt;code&amp;gt;&amp;quot;1472760000000&amp;quot;&amp;lt;/code&amp;gt; || ✓&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;sessid&amp;quot;&amp;lt;/code&amp;gt; || Unique View Session ID must be created upon start of each stream playback, sessid is unique per video play. || &amp;lt;code&amp;gt;&amp;quot;xxxjavd6wzirm93xb95uxjy1ac5wu1627638609&amp;quot;&amp;lt;/code&amp;gt; || ✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example Event =====&lt;br /&gt;
You can call events by passing values in the required parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;devInfo&amp;quot;: [deviceInfo],&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;content&amp;quot;: [content metadata],&lt;br /&gt;
    &amp;quot;ad&amp;quot;: [ad metadata]&lt;br /&gt;
  },&lt;br /&gt;
  // Event Parameters&lt;br /&gt;
  &amp;quot;event&amp;quot;: [event], // event name&lt;br /&gt;
  &amp;quot;position&amp;quot;: [playheadPosition], //position in seconds&lt;br /&gt;
  &amp;quot;type&amp;quot;: [asset type], // values are &amp;quot;content&amp;quot; or &amp;quot;ad&amp;quot;&lt;br /&gt;
  &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;, //unix timestamp in milliseconds&lt;br /&gt;
  &amp;quot;sessid&amp;quot;: &amp;quot;xxxjavd6wzirm93xb95uxjy1ac5wu1627638609&amp;quot;, // unique for each video play&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The full payload including &amp;quot;devInfo&amp;quot; and &amp;quot;metadata&amp;quot; must be populated in each event request.&lt;br /&gt;
&lt;br /&gt;
===== Sample Event Lifecycle for VoD Stream =====&lt;br /&gt;
The sample event lifecycle can be used as a reference for identifying the order for calling events and values to pass.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Start of Session: session ID created when App is opened&lt;br /&gt;
&lt;br /&gt;
// Preroll&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
 &lt;br /&gt;
// Content&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Midroll&lt;br /&gt;
Midroll Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content resumes at 15 minutes&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;900&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content completes at 30 minutes&lt;br /&gt;
Complete {&amp;quot;event&amp;quot;: &amp;quot;complete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;1800&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
 &lt;br /&gt;
// Postroll&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
//End of Session: The delete event should be called when the App is exited. The values for position and type not required to be passed.&lt;br /&gt;
Delete { &amp;quot;event&amp;quot;: &amp;quot;delete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sample Event Lifecycle for VoD Stream - Detailed Storyline'''&lt;br /&gt;
This detailed event sequence provides additional insight for the correct events to call when handling certain playback scenarios.&lt;br /&gt;
&amp;lt;syntaxhighlight lang='javascript'&amp;gt;// SESSION STARTS&lt;br /&gt;
// Start of Session: session ID created when App is opened&lt;br /&gt;
&lt;br /&gt;
// PREROLL&lt;br /&gt;
// Preroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Preroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;15&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472761500000&amp;quot;}&lt;br /&gt;
 &lt;br /&gt;
// CONTENT &lt;br /&gt;
// Content Start - Start new content streams with a position of &amp;quot;0&amp;quot; incrementing the position every 10 seconds.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472761500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content Stop Before Ad Break - Send a playhead update including the current content positon before an Ad break.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;299&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472787400000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// MIDROLL&lt;br /&gt;
// Midroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Midroll Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472787500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Midroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;60&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472793500000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// CONTENT&lt;br /&gt;
// Content resumes at 5 minutes - Send playhead update with the current resumed position, and begin incrimenting the positon every 10 seconds.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;300&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472799500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content completes at 10:12 - Make sure to send in the playhead event with the final content position before sending the complete event.&lt;br /&gt;
Final Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;612&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830700000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
Complete {&amp;quot;event&amp;quot;: &amp;quot;complete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;612&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830800000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// POSTROLL&lt;br /&gt;
// Postroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830900000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Postroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;45&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472835300000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// SESSION ENDS&lt;br /&gt;
&lt;br /&gt;
//End of Session: The delete event should be called when the App is exited. The values for position and type not required to be passed.&lt;br /&gt;
Delete { &amp;quot;event&amp;quot;: &amp;quot;delete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472835400000&amp;quot;} &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Interruption Scenarios =====&lt;br /&gt;
&lt;br /&gt;
As part of configuring events, you will need to handle all possible interruption scenarios such as:&lt;br /&gt;
&lt;br /&gt;
*Wi-Fi OFF / ON&lt;br /&gt;
*App Crash or Exit&lt;br /&gt;
&lt;br /&gt;
When playback is interrupted, the app needs to send delete immediately.&lt;br /&gt;
&lt;br /&gt;
Once playback resumes, a new session will need to be created with a unique session ID. All of the required metadata and events will need to be sent.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The session will automatically timeout after 30 minutes of inactivity.&lt;br /&gt;
&lt;br /&gt;
=== Example Request ===&lt;br /&gt;
&lt;br /&gt;
Now that we walked through the Cloud API integration steps, your requests should have the following components: Session ID, App ID, and Payload. You can reference the example below when your reviewing your integration.&lt;br /&gt;
&lt;br /&gt;
see '''[[#Payload Example|Payload Example]]'''&lt;br /&gt;
&lt;br /&gt;
// Append payload to URL&lt;br /&gt;
function sendPayloadToNielsen() {&lt;br /&gt;
  var payloadStr  = JSON.stringify(payload); // payload as string&lt;br /&gt;
  var imgPing = new Image();&lt;br /&gt;
  imgPing.onload = function() {&lt;br /&gt;
    // onload event, payload succesfull sent&lt;br /&gt;
  };&lt;br /&gt;
  imgPing.onerror = function() {&lt;br /&gt;
    // handle error i.e. wait and send again&lt;br /&gt;
  };&lt;br /&gt;
  imgPing.src = sessionURL+encodeURIComponent(payloadStr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable Debug Logging ===&lt;br /&gt;
&lt;br /&gt;
Now that you have set up the Cloud API requests, you can enable debug logging to validate your integration. Enabling debug logging is required for Nielsen certification.&lt;br /&gt;
&lt;br /&gt;
==== GET Request ====&lt;br /&gt;
&lt;br /&gt;
Display GET Request to console using a name to identify each event (e.g. playhead).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&amp;quot;Event&amp;quot;, image); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Payload ====&lt;br /&gt;
&lt;br /&gt;
Output payload to identify required metadata and events.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&amp;quot;Event Payload&amp;quot;, payload); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HTTP Response Code ====&lt;br /&gt;
&lt;br /&gt;
Confirm request was completed by viewing HTTP response code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
code = msg.GetResponseCode();&lt;br /&gt;
console.log(&amp;quot;Response Code&amp;quot;, code);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can reference the HTTP Response Code table when reviewing your requests:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Status Code !! Status Text !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; || OK || request received&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;403&amp;lt;/code&amp;gt; || Forbidden || invalid App ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; || Not Found || JSON issue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==  Review the Reference Implementation for VoD and Live Streams ==&lt;br /&gt;
&lt;br /&gt;
The Reference Implementation covers vod and Live use cases. &lt;br /&gt;
It also covers DAI (Dynamic Ad Insertion) with  preroll and postroll Ads.&lt;br /&gt;
&lt;br /&gt;
In order to start live stream select the checkbox &amp;quot;isLive&amp;quot; in the &amp;lt;code&amp;gt;Playback Settings&amp;lt;/code&amp;gt; below the video player.&lt;br /&gt;
&lt;br /&gt;
Start the Reference Implementation for AGF by selection Germany in the country dropbox [https://nielsenonlinesupport.com/agf/RefImplCloudAPI/index.htm?debug=true RefImplCloudAPI].&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Review the Nielsen CloudAPI Call Sequence below the Video Player.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disclose Nielsen Privacy Statement ==&lt;br /&gt;
&lt;br /&gt;
The Nielsen Cloud API measurement is working without cookies and other personal information. No user can be identified personally, therefore an opt-out functionality is not required. The Nielsen Cloud API measurement is utilizing a cookieless domain.&lt;br /&gt;
&lt;br /&gt;
In order to disclose Nielsen measurement privacy statement, please include the following items in your privacy policy:&lt;br /&gt;
&lt;br /&gt;
A notice that the player includes third party measurement software that allows users to contribute to market research with anonymous data.&lt;br /&gt;
A link to the Nielsen Digital Measurement Privacy Policy located at https://nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/?lang=de .&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
Before providing an app build to Nielsen for testing, it is important to run validation checks once you have enabled debug logging.&lt;br /&gt;
&lt;br /&gt;
=== Payload Validation ===&lt;br /&gt;
&lt;br /&gt;
Ensure that all of the required payload data is populating while testing several videos. The following areas are critical to measurement:&lt;br /&gt;
*devInfo&lt;br /&gt;
*Asset metadata for both content, and ads&lt;br /&gt;
*Events&lt;br /&gt;
&lt;br /&gt;
=== Player Events ===&lt;br /&gt;
Review event calls:&lt;br /&gt;
&lt;br /&gt;
==== playhead ====&lt;br /&gt;
*Playhead position updates every 10 seconds starting at position '0' for each new asset for VoD stream and UTC Unix Time in seconds for Live stream.&lt;br /&gt;
*Final playhead position is sent on content, or ad before switching between assets.&lt;br /&gt;
*Content metadata remains constant throughout an episode, or clip play.&lt;br /&gt;
*Ad metadata is populated appropriately for each individual ad.&lt;br /&gt;
*Playhead position update resumes for content after an ad break, and resets to 0 for each individual ad.&lt;br /&gt;
*For scrubbing, last current position should be sent while scrubbing occurs, and the new position should also be sent where the user scrubs to.&lt;br /&gt;
*Exiting a stream early should execute the last current position in a playhead update to receive accurate duration.&lt;br /&gt;
*Upon pause, the current position should be sent, and playhead updates should stop incrementing until resume play occurs.&lt;br /&gt;
&lt;br /&gt;
==== complete ====&lt;br /&gt;
*Check that the complete event executes upon content complete after the final playhead update is sent&lt;br /&gt;
*Do not execute the complete event for ads&lt;br /&gt;
&lt;br /&gt;
==== delete ====&lt;br /&gt;
*Check to see that the delete event occurs upon app exit, if the platform has the necessary exit callback events.&lt;br /&gt;
&lt;br /&gt;
==== GET Request Format ====&lt;br /&gt;
*Ensure that the event payloads are formatted in JSON&lt;br /&gt;
*Check to see that each of the Cloud API GET requests are properly encoded&lt;br /&gt;
&lt;br /&gt;
==== HTTP Response ====&lt;br /&gt;
*Make sure that each of the Cloud API Get requests are received by the Nielsen Cloud API properly through use of the HTTP Response Code outputs enabled in console.&lt;br /&gt;
&lt;br /&gt;
== Go Live ==&lt;br /&gt;
After your integration has been certified, you will need to: Change Endpoint and Disable Logging.&lt;br /&gt;
&lt;br /&gt;
'''Change Endpoint:''' You will need to update to the production endpoint:&lt;br /&gt;
&lt;br /&gt;
*Testing: &amp;lt;code&amp;gt;https://sc-eucert.nmrodam.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
*Production: &amp;lt;code&amp;gt;https://???.nmrodam.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your production URL structure should now be:&lt;br /&gt;
&amp;lt;code&amp;gt;https://???.nmrodam.com/nmapi/v2/[appid]/[sessionID]/a?b=[payload]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Disable Logging:''' You can now disable debug logging&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Encoder_Certified_Vendors&amp;diff=6597</id>
		<title>Nielsen Encoder Certified Vendors</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Encoder_Certified_Vendors&amp;diff=6597"/>
		<updated>2024-04-09T22:32:25Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Undo revision 6596 by Mywikis (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|TV}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:TV]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
&amp;lt;!--  --&amp;gt;&lt;br /&gt;
(Linear WM SDK v5.3.4 and v6.0.17 – TV CBET v2 Compliant)&lt;br /&gt;
|-&lt;br /&gt;
! OEM Vendor !! Product !! Product Version !! Numeris Capable !! Numeris Certified !! Linear WM !! VOD in TV Ratings Flag !! VOD Content Ratings !! Commercial&lt;br /&gt;
|-&lt;br /&gt;
| '''Ateme''' || '''TITAN Live'''|| '''4.1''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Amagi''' || '''Cloudport'''|| '''4.x''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''Live''' || '''2.11''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''Live''' || '''2.21.2.0''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''MediaConvert''' || '''1.0''' ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.2.1 (05-08-2020)|5.2.1]] ||&lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''MediaLive''' || '''2.18''' ||'''✔'''|| '''In Process''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (10-26-2021)|5.3.4]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''BCNEXXT''' || '''VIPE''' || '''22.10''' ||'''✔'''|| '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''Cinegy''' || '''Cinegy Air''' || '''11.3''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Clearleap/IBM''' || '''Clearflow''' || '''7.6''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Clearleap/IBM''' || '''Video Logistics Manager''' || '''27''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.0.23 (11-04-2019)|5.0.23]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''coralbay.tv''' || '''coralPlay''' || '''1''' ||'''✔'''|| ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''Dalet''' || '''Amberfin''' || '''11.5.3.0''' ||  ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] &lt;br /&gt;
|-&lt;br /&gt;
| '''encoding.com''' || '''SaaS Cloud Media''' || '''n/a''' ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Evertz''' || '''OvertureRT RenderX''' || '''2.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] || [[Watermark SDK Release Notes#Watermark SDK v4.1.1 (05-19-2017)|4.1.1]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Grass Valley''' || '''AMPP Microservices''' || '''S/W v6 (Windows)''' || ''' ''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Grass Valley''' || '''AMPP Microservices''' || '''GV Engine v3.3 (Windows)''' || ''' ''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Grass Valley''' || '''AMPP Microservices''' || '''GV Engine v3.3 (Linux)''' || ''' ''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||   &lt;br /&gt;
|- &lt;br /&gt;
| '''Grass Valley (Snell)''' || '''ICE''' || '''8.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|- &lt;br /&gt;
| '''Grass Valley''' || '''Miranda iTX OS2''' || '''3.212.0.190''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''Rhozet Carbon Coder''' || '''3.3''' ||  ||  ||  ||  ||   || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''Electra X''' || '''1.4''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''VOS''' || '''1.5''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''VOS''' || '''1.6''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4 &amp;amp; 6.0.1 (immersive)]] ||  [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''XOS''' || '''1.6''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4 &amp;amp; 6.0.1 (immersive)]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Hybrik''' || '''Cloud Media Processing''' || '''1.1''' ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] || &lt;br /&gt;
|-&lt;br /&gt;
| '''Igolgi Inc.''' || '''iLux Broadcast ATSC 1.0''' || '''2.5''' || '''✔''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Imagine Communications''' || '''Aviator Windows AWS and On Premise''' || '''4.8''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (09-26-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Imagine Communications''' || '''Versio Platform''' || '''4.5''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Inetsat''' || '''Video Server''' || '''3''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Linear Acoustic''' || '''Aero''' || '''.100, .2000, .8000''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Linear Acoustic''' || '''LA-5300''' || '''Broadcast Audio Processor''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''Aquila''' || '''5''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''Aquila''' || '''6''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''Aquila''' || '''7''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''MediaKind Encoding Live''' || '''12''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Multiplex Cloud''' || '''NEO''' || '''Ethernet Encoder Module''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Multiplex Cloud''' || '''NEO''' || '''2.10.31''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Dolphin''' || '''1.19''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.1.0.2''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.2.0.6''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.3.0.4''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.3.0.1010''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.4.0''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.5.0''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''PixelPower''' || '''StreamMaster DELIVER''' || '''2''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (09-22-2021)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''PixelTools''' || '''MPEGRepair HD''' || '''7.2''' ||  ||  ||   ||  || || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] &lt;br /&gt;
|-&lt;br /&gt;
| '''PixelTools''' || '''MPEGRepair HD''' || '''9.1''' ||  ||  ||   ||  || || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (11-30-2022)|6.0.13]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Ross''' || '''BAP''' || '''1.1.1''' || '''✔''' ||'''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Ross''' || '''NWE-IP''' || '''1.4.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Stingray Digital Group''' || '''Ubiquicast''' || '''4.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''Synamedia''' || '''vDCM''' || '''20''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Syncbak''' || '''Syncbox''' || '''1.0''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Telestream''' || '''Vantage''' || '''7.0''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]]  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telestream''' || '''Vantage''' || '''8.1''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.23 (06-24-22)|5.3.23]] ||[[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]]  || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telestream''' || '''Transform''' || '''2021-09-001''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.23 (07-27-22)|5.3.23]] ||[[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (12-15-22)|6.0.13]]  || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Vubiquity''' ||  ||  ||  ||  ||  || [[Watermark SDK Release Notes#VOD in TV Ratings Application v1.0.2.1|App v1.0.2.1]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Encoder_Certified_Vendors&amp;diff=6596</id>
		<title>Nielsen Encoder Certified Vendors</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Encoder_Certified_Vendors&amp;diff=6596"/>
		<updated>2024-04-09T22:30:01Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|TV}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:TV]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PCM to ID3 Certifed Vendors'''&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! OEM Vendor !! Product !! Latest Product Version !! SDK Version !! .ts !! Legacy HLS !! Legacy DASH !! CMAF / fMP4 HLS !! CMAF / fMP4 Dash&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''Anvato''' || '''Anvato Media'''|| '''1354''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Ateme''' || '''TITAN File'''|| '''2.16, 2.18, 2.4.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (06-11-2021)|2.3.2]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Ateme''' || '''TITAN Live'''|| '''4.1''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (06-11-2021)|2.3.2]] || ''' ''' || '''✔'''|| '''✔''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''BamTech''' || '''xcoder'''|| '''111''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''BitMovin''' || '''(s/n of device)'''|| '''2.4.8''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || ''' '''|| ''' ''' || '''✔''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Deluxe''' || '''One'''|| '''v1''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| '''✔''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''DisneyStreaming (BamTech)''' || '''xcoder'''|| '''3.0, 4.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Elemental''' || '''Elemental Live'''|| '''2.18, 2.18.3, 2.23.3, 2.24.3, 2.25.3, 2.26.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016) (08-23-2021) |2.3.2]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Elemental''' || '''Elemental MediaLive'''|| '''2.15.6''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || '''✔''' || ''' '''|| ''' ''' || '''✔''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Elemental''' || '''Elemental Server'''|| '''2.16.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Elemental''' || '''Elemental Server'''|| '''2.17.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (08-23-2021)|2.3.2]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Elemental''' || '''Elementa'''|| '''2.19''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (08-23-2021)|2.3.2]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Encoding.com''' || ''' encoding.com '''|| '''1.5''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''Electra XT'''|| '''2.9''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2 ''(TRP only)'']] || '''✔ .trp''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''proMedia'''|| '''2399''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''VOS'''|| '''1.10''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || ''' '''|| ''' ''' || '''✔''' || '''✔'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''VOS 360 Software'''|| '''1.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || ''' '''|| ''' ''' || '''✔''' || '''✔'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''XOS'''|| '''1.19''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Imagine Comms''' || '''SelenioNext'''|| '''1.3''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''iStreamPlanet''' || '''Aventus'''|| '''M2i4''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''iStreamPlanet''' || '''Aventus'''|| '''10''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Inca Networks''' || '''4400 &amp;amp; 3840'''|| '''1.0.51''' ||  [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2 ''(TS only)'']] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Inca Networks''' || '''BlueLine'''|| '''1.0.5''' ||  [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2 ''(TS only)'']] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''MediaExcel''' || '''Hero'''|| '''4.0.6''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind (Ericsson)''' || '''MediaFirst Encoding Live'''|| '''10''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| '''✔''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind (Ericsson)''' || '''Packager'''|| '''12''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || ''' '''|| ''' ''' || '''✔''' || '''✔'''&lt;br /&gt;
|-&lt;br /&gt;
| '''NeuLion''' || '''NeuEncoder'''|| '''4.8''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Quickplay''' || '''2'''|| '''1.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Synamedia (Cisco)''' || '''Anyres Live'''|| '''7.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Synamedia (Cisco)''' || '''Powervue'''|| '''0629''' || [[ID3 SDK Release Notes#ID3 SDK v1.0.0 (04-01-2015)|1.0.0]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Synamedia (Cisco)''' || '''vDCM'''|| '''9.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Syncbak''' || '''Syncbox'''|| '''0201''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Telestream''' || '''Vantage'''|| '''6.3''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Verizon Digital Media Services (VDMS) Edgio''' || '''Uplynk Slicer'''|| '''2203, 2204, 2206, 2207, 2208, 2210, 2212 ''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Verizon Digital Media Services (VDMS) Edgio''' || '''Uplynk Slicer'''|| '''2301, 2302, 2303 (March), 2303 (April), 2304, 2306, 2309, 2311''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''ID3 Tag Validator'''&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! OEM Vendor !! Product !! Latest Product Version !! ID3 Validator&lt;br /&gt;
|-&lt;br /&gt;
| '''Vela''' || '''Encompass'''|| '''130'''  || [[ID3 SDK Release Notes#ID3 Tag Validator SDK v1.8 (10-24-2017)|1.8]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mediaproxy''' || '''LogServer'''|| '''10.1'''  || [[ID3 SDK Release Notes#ID3 Tag Validator SDK v1.8 (10-24-2017)|1.8]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DAR_Tag_Implementation_Guide&amp;diff=6595</id>
		<title>DAR Tag Implementation Guide</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DAR_Tag_Implementation_Guide&amp;diff=6595"/>
		<updated>2024-03-27T02:55:06Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|Digital Ad Ratings}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview of the Nielsen Digital Ad Ratings (DAR) Tags and the steps necessary to implement them as part of your digital advertising campaigns.&lt;br /&gt;
=== What is DAR ===&lt;br /&gt;
DAR is a measurement platform for digital advertising campaigns. The platform provides a clear view of the true audience of a campaign, including Reach, Frequency, and GRP statistics by audience demographic group. &lt;br /&gt;
=== What we measure=== &lt;br /&gt;
All DAR tags allow you to measure campaign impressions and the DAR JavaScript tags measure ad viewability, GIVT (General Invalid Traffic), and SIVT (Sophisticated Invalid Traffic) across platforms including web, mobile, and in-app.&lt;br /&gt;
=== How we measure it=== &lt;br /&gt;
Nielsen’s DAR suite of JavaScript tags together with a pixel tag fallback will be present in your ad placements. We utilize industry-standard APIs to perform measurement cross-browser and cross-platform. In most cases, you will only need to add a simple URL through your ad management interface to fully utilize DAR measurement in your campaigns.&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
For steps outlined in this document, you should have access to Nielsen’s Campaign Management Interface (CMI) and a Nielsen Technical Account Manager (TAM) will be working with you during the implementation phase.&lt;br /&gt;
__TOC__&lt;br /&gt;
= DAR Measurement Types =&lt;br /&gt;
&lt;br /&gt;
== DAR Display== &lt;br /&gt;
&lt;br /&gt;
The DAR Display JavaScript tag reports ad impressions as well as measures ad viewability and SIVT. In standard web placements, it will find the ad unit in the surrounding DOM container and will then report viewability as a time series with a 1-second resolution.&lt;br /&gt;
&lt;br /&gt;
The DAR tag will report the MRC-required minimum of 1 second on screen and a continuous viewability time series for the lifetime of the ad session to enable additional viewability qualifiers.&lt;br /&gt;
&lt;br /&gt;
The tag can utilize the IAB’s [https://iabtechlab.com/standards/open-measurement-sdk/ '''Open Measurement SDK'''] (OM SDK) including [https://iabtechlab.com/blog/open-measurement-for-web-video-arrives/ '''OM Web'''] integration if the OM Interface Definition (OMID) is available, or it will use industry-standard web APIs to measure viewability.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
The DAR Display tag requires a JavaScript-enabled browser for web environments or the OM SDK for in-app to operate and should be placed close to the corresponding measured ad unit. It should be on the same DOM level (e.g. directly under the same parent) or in a child node under the same parent node. The ad unit should be a content-bearing DOM element (e.g. img, canvas, SVG, iframe, div) with a minimum size of 30x30 pixels.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
The minimum required DAR parameters are '''ca, ci, cr, pc, ce''' and '''am'''. See the [[DAR_Tag_Implementation_Guide#Appendix|'''Appendix''']] for a full list of parameters.&lt;br /&gt;
&lt;br /&gt;
=== Example Tag ===&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; &lt;br /&gt;
src=&amp;quot;https://dar.imrworldwide.com/js/dar.js?ca={campaign-id}&amp;amp;cr={creative-id}&amp;amp;ce={site-id}&amp;amp;ci={client-id}&amp;amp;pc={placement-id}&amp;amp;am={ad-server-code}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example OMID Display Placement ===&lt;br /&gt;
&lt;br /&gt;
DAR can be enabled through the OM SDK by passing the required Nielsen OM inputs listed in the table below during setup:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 20%&amp;quot; | OM Parameter&lt;br /&gt;
! style=&amp;quot;width: 40%&amp;quot; | Description&lt;br /&gt;
! style=&amp;quot;width: 40%&amp;quot; | Nielsen Value&lt;br /&gt;
! style=&amp;quot;width: 5%&amp;quot; |Required&lt;br /&gt;
|-&lt;br /&gt;
| Verification Vendor&lt;br /&gt;
| Vendor key for measurement provider&lt;br /&gt;
| nielsen.com-omid&lt;br /&gt;
| ✔&lt;br /&gt;
|-&lt;br /&gt;
| JavaScriptResource&lt;br /&gt;
| URL for measurement provider’s verification script&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;https://dar.imrworldwide.com/js/dar.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| ✔&lt;br /&gt;
|-&lt;br /&gt;
| VerificationParameters&lt;br /&gt;
| Measurement provider’s verification tag parameters&lt;br /&gt;
| style=&amp;quot;font-family:'Courier New', Courier, monospace !important; color:#222222;&amp;quot; |&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;ca={campaign-id}&amp;amp;cr={creative-id}&amp;amp;ce={site-id}&amp;amp;ci={client-id}&amp;amp;pc={placement-id}&amp;amp;am={ad-server-id}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| ✔&lt;br /&gt;
|-&lt;br /&gt;
| Tracking Event verificationNotExecuted&lt;br /&gt;
| Error URL when the ad player denies measurement script execution&lt;br /&gt;
| style=&amp;quot;font-family:'Courier New', Courier, monospace !important; color:#222222;&amp;quot; | &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;https://events.imrworldwide.com/er?ercd=8800&amp;amp;erms=verificationNotExecuted-&lt;br /&gt;
{reason}&amp;amp;ca={campaign-id}&amp;amp;cr={creative-id}&amp;amp;ce={site-id}&amp;amp;ci={client-id}&amp;amp;pc={placement-id}&amp;amp;am={ad-server-id}&amp;amp;c13={asid,app_id}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Note: The verificationNotExecuted Error URL is recommended for better troubleshooting during campaign setup. If your system can provide a macro for the reason of the interrupted measurement session, it can be added in place of the {reason} placeholder in the error URL. This can be an error code or a clear text error message.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Expected Display Ad Session Pings ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
&lt;br /&gt;
! '''Description'''&lt;br /&gt;
! '''Timing'''&lt;br /&gt;
! '''Path'''&lt;br /&gt;
|-&lt;br /&gt;
| DAR Main Ping&lt;br /&gt;
| At initial load&lt;br /&gt;
| secure-gl.imrworldwide.com/cgi-bin/m&lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Measure Ping&lt;br /&gt;
| Measurement start&lt;br /&gt;
| events.imrworldwide.com/nmp&lt;br /&gt;
|-&lt;br /&gt;
| Primary Standard Ping&lt;br /&gt;
| After 1 second of viewable duration (may not occur based on MRC rules)&lt;br /&gt;
| events.imrworldwide.com/psp&lt;br /&gt;
|-&lt;br /&gt;
| Timed Pings&lt;br /&gt;
| At 1, 5, 15 and 120 seconds of ad session time (may not occur based on ad session length)&lt;br /&gt;
| events.imrworldwide.com/1sp, 5sp, 15sp, 120sp&lt;br /&gt;
|-&lt;br /&gt;
| Final Ping&lt;br /&gt;
| At window/tab unloading event&lt;br /&gt;
| events.imrworldwide.com/fp&lt;br /&gt;
|-&lt;br /&gt;
| Error Ping&lt;br /&gt;
| Potential integration error - please contact your Nielsen representative&lt;br /&gt;
| events.imrworldwide.com/er&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ping Flow ===&lt;br /&gt;
&lt;br /&gt;
This flow illustrates the behavior of the DAR Display tag.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2022-06-22 152646.png]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|- &lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Ping Flow Legend&lt;br /&gt;
|- &lt;br /&gt;
| 1SP, 5SP, 15SP, 120SP&lt;br /&gt;
| Timed Measure Ping at 1, 5, 15 and 120 seconds&lt;br /&gt;
|- &lt;br /&gt;
| D0, D1, D2&lt;br /&gt;
| Dynamic SIVT Pings at 1, 15 &amp;amp;amp; 30 seconds&lt;br /&gt;
|- &lt;br /&gt;
| FP&lt;br /&gt;
| Final Ping&lt;br /&gt;
|- &lt;br /&gt;
| IMPID&lt;br /&gt;
| Unique Impression ID&lt;br /&gt;
|- &lt;br /&gt;
| NMP&lt;br /&gt;
| Nielsen Main Measure Ping&lt;br /&gt;
|-&lt;br /&gt;
| PSP&lt;br /&gt;
| Primary Standard Ping&lt;br /&gt;
|-&lt;br /&gt;
| SIVT&lt;br /&gt;
| Sophisticated Invalid Traffic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DAR Video == &lt;br /&gt;
&lt;br /&gt;
The DAR Video tag will typically be trafficked as part of a Video Ad Serving Template (VAST) file. Nielsen provides its wrapped video tag (vWrap) to make this type of deployment easy and consistent across the various ad servers and trafficking options. Nielsen’s vWrap tag supports both automatic OMID and VPAID integration with existing VAST files. The two sections below, [[#Wrapped_Video_Tag_.28vWrap.29_Deployment|'''Wrapped Video Tag''']] and [[#Video_JS_Tag|'''Video JS Tag''']], describe these options and their expected outcomes.&lt;br /&gt;
&lt;br /&gt;
In addition, Nielsen supports '''direct DAR Video tag deployments''' with manual integration in existing workflows. In this case, the section [[#video-js-tag|'''Video JS Tag''']] below describes the basic setup and expected results. In addition, it is recommended that you work closely with your Nielsen Technical Account Manager if you consider a manual tag integration with your campaigns.&lt;br /&gt;
&lt;br /&gt;
=== Wrapped Video Tag (vWrap) Deployment ===&lt;br /&gt;
&lt;br /&gt;
Nielsen’s wrapped DAR video tag, vWrap, is the preferred delivery method for VAST-controlled video ad placements.The vWrap tag is served by a Nielsen service that takes an original VAST with an inline ad (not a wrapper redirect) and dynamically adds the DAR Video tag with measurement solutions for VPAID and OMID. The '''apiframework''' parameter can be used to control which measurement solution will be inserted (see below).&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
The minimum required DAR parameters are '''ca, ci, ce, cr, pc''', '''am, apiframework''' and '''vastURL'''. See the [[DAR_Tag_Implementation_Guide#Appendix|'''Appendix''']] for a full list of parameters.&lt;br /&gt;
&lt;br /&gt;
The Open Real Time Bidding ([https://iabtechlab.com/wp-content/uploads/2022/04/OpenRTB-2-6_FINAL.pdf '''OpenRTB''']) API framework values for identifying the ad inventory type should be passed in the Nielsen '''apiframework''' parameter. The values should be either 1 or 2 (VPAID) or 7 or 8 (OMID). The available API framework values are listed in the IAB’s [https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/master/AdCOM%20v1.0%20FINAL.md#list--api-frameworks- '''AdCOM specification 1.0''']. If the parameter is left blank or set to 0, Wrap will add the DAR Video tag as '''both''' an OMID verification client and VPAID wrapper. See more details in the [[DAR_Tag_Implementation_Guide#Appendix|'''Appendix''']].&lt;br /&gt;
&lt;br /&gt;
The '''vastURL''' parameter must be the last parameter on the DAR tag with its value set as the full URL (including all original parameters) of the original VAST tag for the ad placement.&lt;br /&gt;
&lt;br /&gt;
=== Example Wrapped Video Tag (vWrap) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-family:'Courier New', Courier, monospace !important;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt; https://vwrap.imrworldwide.com/v1/wrap?ca={campaign-id}&amp;amp;cr={creative-id}&amp;amp;ce={site-id}&amp;amp;ci={client-id}&amp;amp;pc={placement-id}&lt;br /&gt;
&amp;amp;am={ad-server-id}&amp;amp;c9={devid,Advertising_ID}&amp;amp;c13=asid,app_id}&amp;amp;apiframework={APIFRAMEWORK}&amp;amp;vastURL={ORIGINAL_VAST_URL}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
To observe how vWrap operates, we have provided some example VAST URLs which you can load directly in your browser.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== VAST ad Unit, no Impression/Viewability ====&lt;br /&gt;
First, here is a VAST ad unit with a single video file and no impression tracking or viewability measurement:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! https://dartag.info/vast-examples/example_video_only_nielsen_15s.xml &lt;br /&gt;
|}&lt;br /&gt;
==== VAST ad Unit, Nielsen vWrap for OMID measurement ====&lt;br /&gt;
This is the same VAST file loaded via Nielsen’s vWrap tag for '''OMID measurement''' (apiframework is set to 7):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! https://vwrap.imrworldwide.com/v1/wrap?ca=nlsn305255&amp;amp;cr=nielsenomidtest&amp;amp;ce=nielsen&amp;amp;pc=vastomid&amp;amp;ci=nlsntest&amp;amp;am=4&amp;amp;apiframework=7&amp;amp;vastURL=http://dartag.info/vast-examples/example_video_only_nielsen_15s.xml&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== VAST ad Unit, Nielsen vWrap for VPAID measurement ====&lt;br /&gt;
And here is the same VAST with the vWrap tag configured for '''VPAID measurement''' (apiframework is set to 2):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!https://vwrap.imrworldwide.com/v1/wrap?ca=nlsn305255&amp;amp;cr=nielsenomidtest&amp;amp;ce=nielsen&amp;amp;pc=vastvpaid&amp;amp;ci=nlsntest&amp;amp;am=4&amp;amp;apiframework=2&amp;amp;vastURL=http://dartag.info/vast-examples/example_video_only_nielsen_15s.xml &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Video JS Tag ===&lt;br /&gt;
&lt;br /&gt;
The DAR Video tag supports both OM SDK and VPAID video ad measurement and provides viewability time series, audio volume time series, GIVT, and SIVT data. The time series contains playhead events with corresponding measurements at a 1-second resolution. In addition to the time series, a dedicated ping will report on the MRC-required minimum of 2 seconds on screen.&lt;br /&gt;
&lt;br /&gt;
With OM SDK, the DAR Video tag supports the following ad types:&lt;br /&gt;
&lt;br /&gt;
* Native mobile in-app ad placements &lt;br /&gt;
* Mobile web ads&lt;br /&gt;
* OM Web placements&lt;br /&gt;
* OMID-enabled streaming video players with ad SDKs (for instance DAI IMA SDK)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With VPAID, it supports the following operating modes:&lt;br /&gt;
* As VPAID wrapper for an existing VPAID ad unit in the VAST&lt;br /&gt;
* As VPAID ad unit in a VAST with video files and AdParameters node&lt;br /&gt;
* In Custom Integrations with VPAID host players&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In most cases, the DAR Video tag should not be manually implemented as a wrapper, instead consider utilizing Nielsen’s vWrap tag.&lt;br /&gt;
&lt;br /&gt;
==== Requirements ====&lt;br /&gt;
&lt;br /&gt;
The DAR Video tag needs a JavaScript environment to operate. The video unit to be measured needs to have a size of at least 30x30 pixels. The DAR Video tag requires access to the VPAID ad unit or to an OM SDK API present in the JavaScript context.&lt;br /&gt;
&lt;br /&gt;
==== Parameters ====&lt;br /&gt;
&lt;br /&gt;
The minimum required DAR parameters are '''ca, ci, ce, cr, pc''' and '''am'''. For VPAID wrapper placements, '''vpaidURL''' is also required.&lt;br /&gt;
&lt;br /&gt;
To comply with MRC guidelines, you will be required to append '''autop''' to indicate click-to-play vs auto-play.&lt;br /&gt;
&lt;br /&gt;
If the DAR Video tag will act as the VPAID wrapper, '''vpaidURL''' has to be the tag’s last parameter and its value set to the full URL (including parameters) of the original VPAID ad unit.&lt;br /&gt;
&lt;br /&gt;
See the [[DAR_Tag_Implementation_Guide#Appendix|'''Appendix''']] for a full list of parameters.&lt;br /&gt;
&lt;br /&gt;
==== Expected Video Ad Session Pings ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! '''Description'''&lt;br /&gt;
! '''Timing'''&lt;br /&gt;
! '''Path'''&lt;br /&gt;
|-&lt;br /&gt;
| DAR Main Ping&lt;br /&gt;
| At initial load&lt;br /&gt;
| secure-gl.imrworldwide.com/cgi-bin/m&lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Measure Ping&lt;br /&gt;
| Measurement start&lt;br /&gt;
| events.imrworldwide.com/nmp&lt;br /&gt;
|-&lt;br /&gt;
| Primary Standard Ping&lt;br /&gt;
| After 2 seconds of viewable duration (may not occur based on MRC rules)&lt;br /&gt;
| events.imrworldwide.com/psp&lt;br /&gt;
|-&lt;br /&gt;
| Quarterly Ping&lt;br /&gt;
| At 25%, 50%, 75% and 100% of video progress&lt;br /&gt;
| events.imrworldwide.com/qp&lt;br /&gt;
|-&lt;br /&gt;
| Final Ping&lt;br /&gt;
| At video stop or window/tab unloading event&lt;br /&gt;
| events.imrworldwide.com/fp&lt;br /&gt;
|-&lt;br /&gt;
| Error Ping&lt;br /&gt;
| Potential integration error - please contact your Nielsen representative&lt;br /&gt;
| events.imrworldwide.com/er&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ping Flow ====&lt;br /&gt;
&lt;br /&gt;
This flow illustrates the behavior of the DAR Video tag if the impression pixel is part of the VAST to be sent by the ad player and the JS tag has '''&amp;amp;amp;darsup=1'''. The parameter, &amp;lt;code&amp;gt;darsup=1&amp;lt;/code&amp;gt;, is used to suppress the DAR Main Ping from being sent from the JS tag since the DAR main ping will be sent from the DAR impression pixel. This is the default setup if Nielsen’s vWrap tag is being used to set up the video campaign.&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2022-06-22 2.png]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|- &lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Ping Flow Legend&lt;br /&gt;
|- &lt;br /&gt;
| D0, D1, D2&lt;br /&gt;
| Dynamic SIVT Pings at 1, 15 &amp;amp;amp; 30 seconds&lt;br /&gt;
|- &lt;br /&gt;
| FP&lt;br /&gt;
| Final Ping&lt;br /&gt;
|- &lt;br /&gt;
| IMPID&lt;br /&gt;
| Unique Impression ID&lt;br /&gt;
|- &lt;br /&gt;
| NMP&lt;br /&gt;
| Nielsen Main Measure Ping&lt;br /&gt;
|-&lt;br /&gt;
| PSP&lt;br /&gt;
| Primary Standard Ping&lt;br /&gt;
|-&lt;br /&gt;
| QP&lt;br /&gt;
|Quarterly Media Pings at 25%, 50%, 75% and 100%&lt;br /&gt;
|-&lt;br /&gt;
| SIVT&lt;br /&gt;
| Sophisticated Invalid Traffic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example OMID Video Placement ====&lt;br /&gt;
&lt;br /&gt;
DAR can be enabled through the OM SDK by passing the required Nielsen OM inputs listed in the table in the VAST &amp;amp;lt;adVerifications&amp;amp;gt; node:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! '''OM Parameter'''&lt;br /&gt;
! '''Description'''&lt;br /&gt;
! '''Nielsen Value'''&lt;br /&gt;
! '''Required'''&lt;br /&gt;
|-&lt;br /&gt;
| Verification Vendor&lt;br /&gt;
| Vendor key for measurement provider&lt;br /&gt;
| nielsen.com-omid&lt;br /&gt;
| ✔&lt;br /&gt;
|-&lt;br /&gt;
| JavaScriptResource&lt;br /&gt;
| URL for measurement provider’s verification script&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;https://dar.imrworldwide.com/js/darvideo.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| ✔&lt;br /&gt;
|-&lt;br /&gt;
| VerificationParameters&lt;br /&gt;
| Measurement provider’s verification tag parameters&lt;br /&gt;
| style=&amp;quot;font-family:'Courier New', Courier, monospace !important; color:#222222;&amp;quot; |&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;ca={campaign-id}&amp;amp;cr={creative-id}&amp;amp;ce={site-id}&amp;amp;ci={client-id}&amp;amp;pc={placement-id}&amp;amp;am={ad-server-id}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| ✔&lt;br /&gt;
|-&lt;br /&gt;
| Verification Not Executed URL&lt;br /&gt;
| Error URL when the ad player denies measurement script execution&lt;br /&gt;
| style=&amp;quot;font-family:'Courier New', Courier, monospace !important; color:#222222;&amp;quot; | &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;https://events.imrworldwide.com/er?ercd=8800&amp;amp;erms=verificationNotExecuted-&lt;br /&gt;
{reason}&amp;amp;ca={campaign-id}&amp;amp;cr={creative-id}&amp;amp;ce={site-id}&amp;amp;ci={client-id}&lt;br /&gt;
&amp;amp;pc={placement-id}&amp;amp;am={ad-server-id}&amp;amp;c9={devid,Advertising_ID}&amp;amp;c13={asid,app_id}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Note: The verificationNotExecuted Error URL is recommended for better troubleshooting during campaign setup. If your system can provide a macro for the reason of the interrupted measurement session, it can be added in place of the {reason} placeholder in the error URL. This can be an error code or a clear text error message.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example VPAID Placement in VAST ====&lt;br /&gt;
&lt;br /&gt;
A typical VAST placement with VPAID will contain an impression pixel, the DAR Video JS tag as MediaFile of type “VPAID”, and the video MediaFiles will be duplicated as AdParameters object. In the example below, there was no original VPAID ad unit (the original VAST only contained MP4 video files), so the &amp;amp;amp;vpaidURL parameter on the DAR JS tag stays empty.&lt;br /&gt;
&lt;br /&gt;
In this example, the DAR JavaScript tag will operate as the VPAID ad unit and will play an appropriate media file from the list contained in the AdParameters node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Impression id=&amp;quot;Nielsen Digital Ad Ratings&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;![CDATA[https://secure-enc.imrworldwide.com/cgi-bin/m?at=view&amp;amp;cy=2&amp;amp;rt=banner&amp;amp;src=njs&amp;amp;&lt;br /&gt;
st=image&amp;amp;tpv=vwrap&amp;amp;ca=nlsnXXXXXX&amp;amp;cr={AD.ID}&amp;amp;ce=publisherXXXX&amp;amp;ci=nlsnciXXXX&amp;amp;pc=placementID_XXXX1&amp;amp;am=3]]&amp;gt;&lt;br /&gt;
&amp;lt;/Impression&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;MediaFiles&amp;gt;&lt;br /&gt;
    &amp;lt;MediaFile apiFramework=&amp;quot;VPAID&amp;quot; type=&amp;quot;application/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;![CDATA[https://dar.imrworldwide.com/js/darvideo.js?darsup=1&amp;amp;ca=nlsnXXXXXX&amp;amp;cr={{AD.ID}}&amp;amp;&lt;br /&gt;
ce=publisherXXXX&amp;amp;ci=nlsnciXXXX&amp;amp;pc=placementID_XXXX1&amp;amp;am=3]]&amp;gt;&lt;br /&gt;
    &amp;lt;/MediaFile&amp;gt;&lt;br /&gt;
    &amp;lt;MediaFile bitrate=&amp;quot;720&amp;quot; delivery=&amp;quot;progressive&amp;quot; height=&amp;quot;480&amp;quot; id=&amp;quot;XXXXXX&amp;quot;&lt;br /&gt;
               maintainAspectRatio=&amp;quot;true&amp;quot; scalable=&amp;quot;true&amp;quot; type=&amp;quot;video/mp4&amp;quot;  &lt;br /&gt;
               width=&amp;quot;854&amp;quot;&amp;gt;&amp;lt;![CDATA[https://XXXXX.net/XXXXXX.mp4]]&amp;gt;&lt;br /&gt;
    &amp;lt;/MediaFile&amp;gt;&lt;br /&gt;
&amp;lt;/MediaFiles&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;AdParameters&amp;gt;&lt;br /&gt;
&amp;lt;![CDATA[{&amp;quot;mediaFiles&amp;quot;:[{&amp;quot;bitrate&amp;quot;:&amp;quot;720&amp;quot;,&amp;quot;uri&amp;quot;:&amp;quot;https://XXXXX.net/XXXXXX.mp4&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;480&amp;quot;,&amp;quot;scalable&amp;quot;:&amp;quot;true&amp;quot;,&lt;br /&gt;
&amp;quot;id&amp;quot;:&amp;quot;XXXXXX&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;video/mp4&amp;quot;,&amp;quot;maintainAspectRatio&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;delivery&amp;quot;:&amp;quot;progressive&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;854&amp;quot;}]]&amp;gt;&lt;br /&gt;
&amp;lt;/AdParameters&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Server-Side Integration ====&lt;br /&gt;
&lt;br /&gt;
If you are interested in implementing the DAR tags server-side, e.g. through SSAI, please contact your Nielsen TAM to provide you with the required guidelines.&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&lt;br /&gt;
Manual placement of the DAR Video tag is only recommended in situations where the DAR vWrap tag can not be utilized, like in certain mobile in-app ad placements or in scenarios where DAR Video needs to be configured as OMID viewability measurement solution.&lt;br /&gt;
&lt;br /&gt;
== Pixel Tag== &lt;br /&gt;
&lt;br /&gt;
The DAR Impression pixel provides basic campaign impression counts and allows to cover placements served in environments where the DAR JavaScript tag is not supported.&lt;br /&gt;
&lt;br /&gt;
=== Environment ===&lt;br /&gt;
&lt;br /&gt;
The DAR pixel tag should only be used in environments where the DAR JavaScript tag cannot be utilized such as restricted CTV environments, for SSAI Server-Side Beaconing, and other situations where an adequate JavaScript environment is not available.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
The minimum required DAR parameters are '''ca, ci, ce, cr, pc''', and '''am''' along with fixed valued params, '''at=view''', '''rt=banner''' and '''st=image''' . See the [[DAR_Tag_Implementation_Guide#Appendix|'''Appendix''']] for a full list of parameters.&lt;br /&gt;
&lt;br /&gt;
=== Example Tag ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;https://secure-gl.imrworldwide.com/cgi-bin/m?ca=nlsnXXXXXX&amp;amp;cr=crtve&lt;br /&gt;
&amp;amp;ce={PUBLISHER.ID}&amp;amp;pc=PLACEMENT.ID}&amp;amp;nlsnciXXXX&amp;amp;am=3&amp;amp;at=view&amp;amp;rt=banner&amp;amp;st=image&lt;br /&gt;
&amp;amp;cy=0&amp;amp;r=[timestamp]&amp;quot; style=&amp;quot;display:none&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Integration =&lt;br /&gt;
A successful tag integration will require you to go through the following 6 steps.&lt;br /&gt;
== Step 1: Determine Your Campaign Needs== &lt;br /&gt;
To receive optimal results from DAR measurement, it is good practice to consider the technical requirements of different sites and placements. Please share your media plan with your Technical Account Manager before launch.&lt;br /&gt;
&lt;br /&gt;
Specifically, be on the lookout for placements that might span across web and mobile ad inventory and make sure if all of the in-app placements support OMID. Also, some placement types may need manual setup and cannot be automated or may need extra time for setup and testing.&lt;br /&gt;
&lt;br /&gt;
Please reach out to your Nielsen Technical Account Manager (TAM) for advice if the technical requirements for your campaign are not clear.&lt;br /&gt;
== Step 2: Generate Tags== &lt;br /&gt;
Your Nielsen representative will walk you through the Campaign Management Interface (CMI) so that you can generate DAR tags for your campaigns at any time.&lt;br /&gt;
&lt;br /&gt;
Nielsen supports macro-based tag generation for several major ad servers. Nielsen’s Technical Account Managers can assist you with any technical questions on tagging campaigns for DAR measurement.&lt;br /&gt;
== Step 3: Campaign Integration== &lt;br /&gt;
Your Nielsen tags created in CMI will need to be included when you traffic your ad campaigns. Please reach out to your Nielsen TAM for additional guidance and assistance.&lt;br /&gt;
== Step 4: Test the Tag Implementation== &lt;br /&gt;
Depending on the complexity of the integration, you may be working closely with a TAM at this point or are performing a self-guided tag implementation based on the CMI output.&lt;br /&gt;
&lt;br /&gt;
If working with a TAM, they will coordinate a plan to test the tag implementation ahead of the campaign go-live date. Depending on your campaign needs, testing will involve either running a diagnostic campaign to validate tagging setup or reviewing test pages or apps.&lt;br /&gt;
&lt;br /&gt;
In case of a self-guided tag implementation, we recommend to verify and compare the impression counts in the CMI with your planned campaign volume or ad server reports during the first hours of the campaign. If there are any unexpected impression counts, please reach out to your Nielsen TAM.&lt;br /&gt;
== Step 5: Share your Ad Server Report== &lt;br /&gt;
&lt;br /&gt;
=== Why the Ad Server Report is Needed ===&lt;br /&gt;
&lt;br /&gt;
Knowing the delivered impressions helps Nielsen run Discrepancy Checks ensuring overall quality and reduces errors in the tagging process.&lt;br /&gt;
&lt;br /&gt;
Nielsen can provide the client with a template with the inputs required to complete the quality checks.&lt;br /&gt;
&lt;br /&gt;
=== How to Share Your Delivered impressions ===&lt;br /&gt;
&lt;br /&gt;
Set up an automated daily report from your ad server containing Site Name, Site ID, Placement Name, Placement ID, and data date.&lt;br /&gt;
&lt;br /&gt;
A secondary method to share your media plan information is to grant Nielsen “Reporting access” to your campaign in the designated ad server (such as DCM). To do this, simply grant the login '''clientreporting@nielsen.com''' access. In doing so Nielsen can directly access your media plan information, which enables us to check for updates, and reconcile any discrepancies.&lt;br /&gt;
&lt;br /&gt;
== Step 6: Monitoring Your Campaign== &lt;br /&gt;
Nielsen recommends all clients participate in Discrepancy Checks. Nielsen’s team will verify that the tags delivered have begun to receive data once the campaign goes live and will regularly (typically every 7-14 days) compare the Nielsen reporting to your 3rd party or publisher reporting to ensure we are capturing all data across all placements, as expected, and that the discrepancy gap between your reporting and the Nielsen reporting is kept to a minimum.&lt;br /&gt;
&lt;br /&gt;
= Appendix =&lt;br /&gt;
== Tag Parameters== &lt;br /&gt;
All passthrough parameters will appear on the JavaScript-generated DAR impression ping.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-weight:bold; background-color:#EAECF0; color:#222;&amp;quot;&lt;br /&gt;
! Query Parameter&lt;br /&gt;
! Description&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot; | Required&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot; | Pass-through&lt;br /&gt;
|- style=&amp;quot;font-weight:bold; text-align:center; vertical-align:middle; background-color:#FFEBD3; color:#222;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; | Group 1 - Required Parameters&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| ca&lt;br /&gt;
| Campaign ID&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| pc&lt;br /&gt;
| Placement ID&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| ci&lt;br /&gt;
| Client ID&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| am&lt;br /&gt;
| Ad server ID&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;color:#222;&amp;quot;&lt;br /&gt;
| ce&lt;br /&gt;
| Site ID&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;background-color:#F4F5F7; color:#222;&amp;quot;&lt;br /&gt;
| cr&lt;br /&gt;
| Creative ID&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:#EFEFEF;&amp;quot; | X&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;font-weight:bold; text-align:center; vertical-align:middle; background-color:#FFEBD3; color:#222;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; | Group 2 - Use Case Specific Parameters&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| at&lt;br /&gt;
| Fixed Value &amp;quot;view&amp;quot; (Nielsen value, JS tags add this to DAR and NMP pings)&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Pixel only&lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| st&lt;br /&gt;
| Fixed Value &amp;quot;image&amp;quot; (Nielsen value, JS tags add this to DAR and NMP pings)&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Pixel only&lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| rt&lt;br /&gt;
| Fixed Value &amp;quot;banner&amp;quot; (Nielsen value, JS tags add this to DAR and NMP pings)&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Pixel only&lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| r&lt;br /&gt;
| Cachebuster/Timestamp. It's required in the pixel tags with a hardcoded&amp;lt;br /&amp;gt;value as a default or a macro (r=timestamp/macro) .&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Pixel only&lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| cy&lt;br /&gt;
| Creative type (1: display/2: video) JS tags add this to DAR and NMP pings for In-House Viewability.&amp;lt;br /&amp;gt;When parameter is not present or value is missing on pixel tags, there will be no creative type breakout.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Pixel only&lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| '''[[DAR_Tag_Implementation_Guide#vWrap_apiframework_Values|apiframework]]'''&lt;br /&gt;
| IAB-defined value designating the measurement method See vWrap apiframework values&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | vWrap only&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| autof&lt;br /&gt;
| Video only: Auto refresh (1 for auto refresh, leave empty otherwise)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| autop&lt;br /&gt;
| Video only: Autoplay (1 for auto-play, 2 for click-to-play, leave empty otherwise)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| c7&lt;br /&gt;
| OS Grouping&amp;lt;br /&amp;gt;c7=osgrp,IOS&amp;lt;br /&amp;gt;c7=osgrp,DROID&amp;lt;br /&amp;gt;c7=osgrp,ANDROID&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| c8&lt;br /&gt;
| Device Grouping&amp;lt;br /&amp;gt;c8=devgrp,DSK (computers)&amp;lt;br /&amp;gt;c8=devgrp,PHN (mobile phone devices)&amp;lt;br /&amp;gt;c8=devgrp,TAB (mobile tablet devices)&amp;lt;br /&amp;gt;c8=devgrp,PMP (portable media player)&amp;lt;br /&amp;gt;c8=devgrp,UNWN (unknown mobile devices)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| c9&lt;br /&gt;
| Mobile Advertising ID&amp;lt;br /&amp;gt;c9=devid,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Mobile&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| c10&lt;br /&gt;
| Platform&amp;lt;br /&amp;gt;c10=plt,DSK (Computer)&amp;lt;br /&amp;gt;c10=plt,MBL (Mobile)&amp;lt;br /&amp;gt;c10=plt,OTT (Connected Device)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| c12&lt;br /&gt;
| App Version&amp;lt;br /&amp;gt;c12=apv,xxx&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| c13&lt;br /&gt;
| Nielsen Assigned App ID&amp;lt;br /&amp;gt;Example:&amp;lt;br /&amp;gt;c13=asid,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Mobile&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| c14&lt;br /&gt;
| OS Version&amp;lt;br /&amp;gt;c14=osver,xxx&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| c68&lt;br /&gt;
| Mobile App Bundle ID&amp;lt;br /&amp;gt;c68=bndlid,xxxxxxxxxxxxxx&amp;lt;br /&amp;gt;References:&amp;lt;br /&amp;gt;https://developer.apple.com/documentation/appstoreconnectapi/bundle_ids&amp;lt;br /&amp;gt;https://developer.android.com/studio/build/configure-app-module#set_the_application_id&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Mobile&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| C78&lt;br /&gt;
| Custom Integration Flag (please note: this is the only uppercase parameter name)&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | some vendors&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| darsup&lt;br /&gt;
| If present suppress DAR main ping originating from JS tag (value can be 0 or 1, same effect)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| forceid&lt;br /&gt;
| If present provides impid, can be overwritten by impid parameter&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X (as impid)&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| impid&lt;br /&gt;
| Same as forceid, but higher priority in case both are present&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| frcd&lt;br /&gt;
| Video only: Forced duration (seconds/null)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| frcf&lt;br /&gt;
| Video only: Forced ad flag (yes/no/null)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| ptraf&lt;br /&gt;
| Video only: Purchased traffic&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| contplay&lt;br /&gt;
| Video only: Continuous play&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| gdpr&lt;br /&gt;
| GDPR flag to indicate whether GDPR is applicable:&amp;lt;br /&amp;gt;0 - GDPR does not apply&amp;lt;br /&amp;gt;1 - GDPR applies&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | in some jurisdictions&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| gdpr_consent&lt;br /&gt;
| URL-safe base64-encoded Transparency &amp;amp; Consent (TC) string for&amp;lt;br /&amp;gt;identifying user's privacy preferences&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | in some jurisdictions&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| hem_sha256&lt;br /&gt;
| Hashed email&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| hem_unknown&lt;br /&gt;
| Hashed email&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| mode&lt;br /&gt;
| VPAID video only, optional: Custom Direct Access mode&amp;lt;br /&amp;gt;(&amp;quot;w&amp;quot; wrapper / &amp;quot;c&amp;quot; custom; defaults to wrapper)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| onload&lt;br /&gt;
| VPAID video only, optional: JS callback for Custom Direct Access VPAID integration&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| pub&lt;br /&gt;
| Publisher Name&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| pubid&lt;br /&gt;
| Publisher ID&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| si&lt;br /&gt;
| Site identifier. Canonical URL of the content where the Ad creative is served.&amp;lt;br /&amp;gt;The parameter value has to be encoded with encodeURIComponent() method or equivalent.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| uid2&lt;br /&gt;
| Unified ID 2.0&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#EFEFEF; color:#222;&amp;quot;&lt;br /&gt;
| uid2_token&lt;br /&gt;
| Unified ID 2.0 token&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; color:#222;&amp;quot;&lt;br /&gt;
| uoo&lt;br /&gt;
| User opt out&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Mobile&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | X&lt;br /&gt;
|- style=&amp;quot;font-weight:bold; text-align:center; vertical-align:middle; background-color:#FFEBD3; color:#222;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; | Group 3 - Parameters With Required Position in URL&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#ffffff; color:#222;&amp;quot;&lt;br /&gt;
| vpaidURL&lt;br /&gt;
| VPAID Video only: Always the last parameter for video tags.&amp;lt;br /&amp;gt;Either VPAID ad unit URL to be wrapped or empty. If empty, DAR tag will use its own vpaidplayer.js&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | VPAID video tag only&lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;background-color:#f4f5f7;&amp;quot;&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; color:#222;&amp;quot; | vastURL&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; color:#222;&amp;quot; | vWrap Tag only: Always the last parameter for the vWrap tag.&amp;lt;br /&amp;gt;It must contain the URL of the original VAST for the placement.&lt;br /&gt;
| style=&amp;quot;text-align:center; vertical-align:middle; color:#222;&amp;quot; | vWrap tag only&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Additional Parameters == &lt;br /&gt;
This section describes several important additional parameters that the DAR tag can support, specifically Hashed Email, UID2 values, along with Page URL and Bundle Identifier if available. Please note that all parameters are case-sensitive.&lt;br /&gt;
&lt;br /&gt;
Please work with your Nielsen Technical Account Manager to decide which of the following parameters to append to the standard DAR tag.&lt;br /&gt;
=== HEM Support (Hashed Email) ===&lt;br /&gt;
Please use the parameter that matches your hashing algorithm. For example, if you are using sha256 to encode the email address, then use hem_sha256={encrypted_value_here}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-weight:bold; background-color:#EAECF0;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
! Available Tag Parameters&lt;br /&gt;
|- style=&amp;quot;font-weight:normal; background-color:#F8F9FA;&amp;quot;&lt;br /&gt;
| Hashed Email&lt;br /&gt;
| User’s email address that has been run through the sha256 hashing algorithm to create a unique hexadecimal string.&amp;lt;br /&amp;gt; If a client is unable to determine hashing type, they should pass&amp;lt;br /&amp;gt;using &amp;amp;hem_unknown parameter.&lt;br /&gt;
| &amp;amp;hem_unknown&amp;lt;br /&amp;gt;&amp;amp;hem_sha256&amp;lt;br /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-weight:bold;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#dae8fc; color:#002041;&amp;quot;&lt;br /&gt;
! Example&lt;br /&gt;
|- style=&amp;quot;font-weight:normal;&amp;quot;&lt;br /&gt;
| hem_sha256=671638d17df92ac6e46e3f00ad0e78f09116ca29128e93dcb53ff340abdeb2c2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Unified ID ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#F8F9FA;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-weight:bold; background-color:#EAECF0;&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
! Available Tag Parameters&lt;br /&gt;
|-&lt;br /&gt;
| Unified ID 2.0&lt;br /&gt;
| An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD)&amp;lt;br /&amp;gt;and is now managed by Prebid.&lt;br /&gt;
| &amp;amp;uid2&lt;br /&gt;
|-&lt;br /&gt;
| Unified ID 2.0 Token&lt;br /&gt;
| Encrypted Unified ID 2.0&lt;br /&gt;
| &amp;amp;uid_token&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-weight:bold;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#32BBB9; color:#002041;&amp;quot;&lt;br /&gt;
! Example&lt;br /&gt;
|- style=&amp;quot;font-weight:normal;&amp;quot;&lt;br /&gt;
| uid2=MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;lt;br /&amp;gt;uid_token=AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8QlDSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeKQI1mp015jsNnpX5&amp;lt;br /&amp;gt;/xGgXldcgVz+gFnyh3T8/3agMwRmyrhCxG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Page and Bundle ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#F8F9FA;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-weight:bold; background-color:#EAECF0;&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
! Available Tag Parameters&lt;br /&gt;
|-&lt;br /&gt;
| Page URL&lt;br /&gt;
| Canonical URL of the content where the Ad creative is served. (e.g. https://example.com/news/tech/article.html) &amp;lt;br /&amp;gt;The parameter value has to be encoded with JavaScript’s encodeURIComponent() method or equivalent. &amp;lt;br /&amp;gt;Example: si=https%3A%2F%2Fexample.com%2Fnews%2Ftech%2Farticle.html&lt;br /&gt;
| &amp;amp;si&lt;br /&gt;
|-&lt;br /&gt;
| App Bundle ID&lt;br /&gt;
| The app’s unique bundle ID (e.g. com.example.myapp). The ID can be used to look up the App in Apple’s App Store&amp;lt;br /&amp;gt;or the Google Play Store.&amp;lt;br /&amp;gt;References: https://developer.android.com/studio/build/application-idhttps://developer.apple.com/documentation/appstoreconnectapi/bundle_ids&lt;br /&gt;
| &amp;amp;c68=bndlid&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-weight:bold;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#32BBB9; color:#002041;&amp;quot;&lt;br /&gt;
! Example&lt;br /&gt;
|- style=&amp;quot;font-weight:normal;&amp;quot;&lt;br /&gt;
| si=https%3A%2F%2Fexample.com%2Fnews%2Ftech%2Farticle.html&amp;lt;br /&amp;gt;c68=bndlid,com.tam.nielsen.com&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== vWrap apiframework Values== &lt;br /&gt;
&lt;br /&gt;
Nielsen’s vWrap tag uses the existing definition of '''apiframework''' values defined in the IAB’s [https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/master/AdCOM%20v1.0%20FINAL.md#list--api-frameworks- '''AdCOM Specification''' '''1.0''']. This means that existing macros for this parameter in your system should work out of the box with vWrap.&lt;br /&gt;
&lt;br /&gt;
The vWrap tag supports the numerical values in bold below. In case of '''8''' (SIMID), the DAR Video tag will be inserted as a standard OMID verification client for viewability measurement and it will not interfere with any SIMID components in the ad.&lt;br /&gt;
&lt;br /&gt;
If a '''0''' or an empty value is given, the resulting VAST will include both OMID and VPAID measurement solutions. This leaves the decision of the measurement method to the video player, which might be advantageous for mixed campaigns that span mobile and web environments.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-weight:bold;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#F4F5F7;&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Definition&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;font-weight:normal;&amp;quot; | VPAID 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| style=&amp;quot;font-weight:normal;&amp;quot; | VPAID 2.0&lt;br /&gt;
|- style=&amp;quot;font-weight:normal; color:#666;&amp;quot;&lt;br /&gt;
| 3&lt;br /&gt;
| MRAID 1.0&lt;br /&gt;
|- style=&amp;quot;font-weight:normal; color:#666;&amp;quot;&lt;br /&gt;
| 4&lt;br /&gt;
| ORMMA&lt;br /&gt;
|- style=&amp;quot;font-weight:normal; color:#666;&amp;quot;&lt;br /&gt;
| 5&lt;br /&gt;
| MRAID 2.0&lt;br /&gt;
|- style=&amp;quot;font-weight:normal; color:#666;&amp;quot;&lt;br /&gt;
| 6&lt;br /&gt;
| MRAID 3.0&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| style=&amp;quot;font-weight:normal;&amp;quot; | OMID 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| style=&amp;quot;font-weight:normal;&amp;quot; | SIMID 1.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SERVER-SIDE TAG DISPATCH ==&lt;br /&gt;
The standard way of triggering a Digital Ad Ratings (DAR) tag on mobile in-app or connected devices is for the publisher to trigger the tag upon ad exposure to the user (either directly or via the ad server). This can be described as a client-side initiated tag.&lt;br /&gt;
&lt;br /&gt;
It is important to note that MRC/IAB measurement standards stipulate that the ad exposure event still be initiated and recorded from the client-side, even if the ad measurement tag (in this case a DAR tag) is physically initiated from the server-side. Evidence may be required (eg. publisher log file or similar) from the MRC/IAB to substantiate that the user was exposed to the ad on their device.&lt;br /&gt;
&lt;br /&gt;
In addition to the tag parameters covered in the prior sections, the following HTTP headers need to be modified in the DAR calls to support dispatch from a '''server-side''' publisher ad server:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|- style=&amp;quot;text-align:center; background-color:#c0c0c0; color:#000000;&amp;quot;&lt;br /&gt;
! HTTP Headers&lt;br /&gt;
! Description of Modifications&lt;br /&gt;
|-&lt;br /&gt;
| User-Agent (UA)&lt;br /&gt;
| This is expected to be the originating client user-agent for the&amp;lt;br /&amp;gt; device where the user was exposed to the ad. The HTTP UA from &amp;lt;br /&amp;gt;the client device should be used to populate the HTTP UA in the&amp;lt;br /&amp;gt; server-side connection/ping. DAR leverages the type of&amp;lt;br /&amp;gt;device for platform derivation.&lt;br /&gt;
|-&lt;br /&gt;
| X-Forwarded-For (XFF) IP&lt;br /&gt;
| This is expected to be the originating client IP address for the &amp;lt;br /&amp;gt;device where the user was exposed to the ad. Note: When the tag&amp;lt;br /&amp;gt; is fired directly from the ad server, the X-Real-IP will be the ad server IP.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server Side Tag Notes ===&lt;br /&gt;
&lt;br /&gt;
* The server-side tag collection only supports mobile in-app and connected device measurement and will not support cookie-based browser measurement.&lt;br /&gt;
&lt;br /&gt;
* The client’s server-side setup to trigger/send the DAR tag should suppress any Nielsen cookie returned by the Nielsen collection server as a result of the first DAR tag received. If the Nielsen cookie (returned upon receiving the first DAR tag into secure.imrworldwide.com) is not suppressed, then invalid traffic (IVT) filtration will be triggered upon receiving the 2nd and nth tag.&lt;br /&gt;
&lt;br /&gt;
* The tag received by Nielsen must be TLS v1.2 compliant or greater.&lt;br /&gt;
&lt;br /&gt;
== About Nielsen ==&lt;br /&gt;
&lt;br /&gt;
Nielsen shapes the world’s media and content as a global leader in audience measurement, data and analytics. Through our understanding of people and their behaviors across all channels and platforms, we empower our clients with independent and actionable intelligence so they can connect and engage with their audiences—now and into the future.&lt;br /&gt;
&lt;br /&gt;
A Nielsen operates around the world in more than 55 countries. Learn more at [http://www.nielsen.com '''www.nielsen.com'''] and connect with us on social media.&lt;br /&gt;
&lt;br /&gt;
'''Audience Is Everything®'''&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DCR_Thailand_Video_iOS_SDK&amp;diff=6594</id>
		<title>DCR Thailand Video iOS SDK</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DCR_Thailand_Video_iOS_SDK&amp;diff=6594"/>
		<updated>2024-03-27T02:54:21Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International_DCR}} {{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. 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 covers implementation steps for iOS using Xcode utilizing the Standard Nielsen SDK for DCR.&lt;br /&gt;
&lt;br /&gt;
{{iOS_SpecialNotes_for_iOS14}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_SpecialNotes_for_iOS17}}&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
Before you start the integration, you will need:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
 || '''App ID (appid)''' || Unique ID assigned to the player/site and configured by product. || Provided by Nielsen&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
 || '''Nielsen SDK''' || Includes SDK frameworks and '''sample implementation'''; ''See [[iOS SDK Release Notes]]'' || [[Special:Downloads|Download]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If need App ID(s) or our SDKs, feel free to reach out to us and we will be happy to help you get started.&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;
Version 8 of the Nielsen App SDK will come in three versions. One that is enabled to work with the App Tracking Transparency Framework, another version that does not use the Ad Framework, and a version for Kids Apps or where noID is required. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! SDK Flavor&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''iOS Ad Version'''&lt;br /&gt;
|* Opt-In and Opt-Out functionality managed by the [https://developer.apple.com/documentation/apptrackingtransparency AppTrackingTransparency framework] . '''(Preferred approach)''' &amp;lt;br /&amp;gt;* The Nielsen SDK will attempt to collect the IDFA (Id for Advertisers) on the device.&amp;lt;br&amp;gt; * For iOS14+, if the value returned is &amp;lt;code&amp;gt;ATTrackingManager.AuthorizationStatus.authorized&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;*  If the device is running iOS12 or iOS13, the Limit Ad Tracking setting is requested.&lt;br /&gt;
|-&lt;br /&gt;
| '''iOS No Ad Framework'''&lt;br /&gt;
|* Without the Ad Framework, the Nielsen SDK cannot read the IDFA, so it will attempt to retrieve the '''IDFV'''.&amp;lt;br /&amp;gt;* The [https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor ID for Vendors (IDFV)], may be used for analytics across apps from the same content provider.&amp;lt;br /&amp;gt;* The developer is required to present the User Choice Opt Out page which is described in the [[DCR_Thailand_Video_iOS_SDK#Global_iOS_SDK_No_Ad_Framework_Optout|Privacy Section]].&lt;br /&gt;
|-&lt;br /&gt;
| '''iOS SDK noID'''&lt;br /&gt;
|* This version of the Nielsen SDK is perfect for Kid apps, or where no ID is required.&amp;lt;br&amp;gt;* Please review the [[DCR_Thailand_Video_iOS_SDK#Global_iOS_SDK_No_ID_Optout_.28Kids_Category.29|Opt Out Requirement]].&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 CocoaPods. We recommend using the CocoaPods-based integration whenever possible to ensure you maintain the most recent changes and enhancements to the Nielsen libraries.&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain CocoaPods implementation guide]]&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[DCR_Video_iOS_SDK_xcframework|Using the XCFramework bundle]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&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_Thailand_Video_iOS_SDK#Removing_Simulators_.28Dynamic_Framework_Only.29|found below]].&lt;br /&gt;
&lt;br /&gt;
'''[[DCR_Video_iOS_SDK_xcframework|XCFramework]]''' is solution for the problems described above Apple recommends to use XCFrameworks. In XCFramework, we no longer build a single framework with multiple architectures. Instead, we build one small framework for each combination of architecture and target and store it in its own folder. The top-level XCFramework folder have folders like ios-arm64, ios-arm64-simulator, etc. Each of these folders is its own framework, complete with headers, modules, and binary.&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, when using the dynamic framework,  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. (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.  (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.  (''Not required if using CocaPods'')&lt;br /&gt;
&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;
Add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
@import NielsenAppApi;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iOS_SDK_Initialization}}&lt;br /&gt;
&lt;br /&gt;
== Configure 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 Nielsen Key names (e.g. appid, program) 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;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Create channelName 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;
=== Create Content Metadata ===&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.&lt;br /&gt;
&amp;lt;blockquote&amp;gt; program and title metadata values should be passed to SDK as UTF-8 strings. &amp;lt;/blockquote&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;
| 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;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| subbrand	|| 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)&lt;br /&gt;
||&lt;br /&gt;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| type ||	type of asset	|| &amp;quot;content&amp;quot;	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid	|| unique ID assigned to asset 	|| custom&amp;lt;br&amp;gt;(no [[Special Characters]]). The Content ID should be populated here which should correspond to the same value in the post transmission logs. || ✓&lt;br /&gt;
|-&lt;br /&gt;
| program	|| name of program 	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| title	|| episode name	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| length	|| length of content in seconds	|| seconds (86400 for live stream)||	✓&lt;br /&gt;
|-&lt;br /&gt;
| segB	|| custom segment B. Custom segments can be used to aggregate content however you choose. Some examples include genre, category, or platform.	|| custom	||&lt;br /&gt;
|-&lt;br /&gt;
| segC	|| For VOD: Populate TVContent ID, For livestream: leave blank	|| custom	 || Required for VOD only&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode	|| full episode flag ||	&lt;br /&gt;
*'y', 'yes', or 'lf' – full episode&lt;br /&gt;
*'n', 'no', or 'sf' – non full episode	&lt;br /&gt;
'''Note:''' For livestream content with Dynamic Ad Insertion (DAI), the isfullepisode value should be set to 'y'. &lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|-&lt;br /&gt;
|adloadtype	|| type of Ad load:&lt;br /&gt;
* 1) Linear – matches TV Ad load. Content with linear Ad Load is not eligible for DCR measurement and will not be included in DCR reporting.&lt;br /&gt;
* 2) Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
||&lt;br /&gt;
*&amp;quot;1&amp;quot; – content with linear Ads. Note: Content with linear Ad load is not included in DCR measurement. &lt;br /&gt;
*&amp;quot;2&amp;quot; – content with dynamic Ads	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Metadata Example ====&lt;br /&gt;
&amp;lt;code&amp;gt;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;
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;C77664&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Program S2, E3&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&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;adloadtype&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;, //optional&lt;br /&gt;
    &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;, //optional&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Objective-C&amp;lt;/code&amp;gt;    &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
NSDictionary * contentMetadata = @ {&lt;br /&gt;
    @ &amp;quot;type&amp;quot;: @ &amp;quot;content&amp;quot;,&lt;br /&gt;
    @ &amp;quot;assetid&amp;quot;: @ &amp;quot;C77664&amp;quot;,&lt;br /&gt;
    @ &amp;quot;title&amp;quot;: @ &amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    @ &amp;quot;isfullepisode&amp;quot;: @ &amp;quot;y&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;adloadtype&amp;quot;: @ &amp;quot;2&amp;quot;,&lt;br /&gt;
    @ &amp;quot;segB&amp;quot;: @ &amp;quot;CustomSegmentValueB&amp;quot;, //optional&lt;br /&gt;
    @ &amp;quot;segC&amp;quot;: @ &amp;quot;CustomSegmentValueC&amp;quot;, //optional&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Configure metadata === &lt;br /&gt;
channelName should remain constant throughout the completion of an episode or live stream.&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	|| ChannelInfo refers to the Channel name. This can be a free-form value&lt;br /&gt;
value such as a friendly name for the content being played. the SDK&amp;lt;br/&amp;gt;&lt;br /&gt;
will pass the application name automatically.&lt;br /&gt;
|| custom	|| No&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&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.&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	||  &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;'midroll'&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;'postroll'&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;'ad'&amp;lt;/code&amp;gt;  - If specific type can not be identified.||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to Ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| ✓&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;
// create Ad object&lt;br /&gt;
&amp;quot;ad&amp;quot;: {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iOS_LifeCycle_of_SDK}}&lt;br /&gt;
&lt;br /&gt;
== Configure API Calls ==&lt;br /&gt;
&amp;lt;!--[[File:appsdkTimeline-DCR.png|icon|link=]]--&amp;gt;&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;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;nielsenMeter.play()&amp;lt;/code&amp;gt; || // Call at start of each new stream&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nielsenMeter.loadMetadata(contentMetadata)&amp;lt;/code&amp;gt; || // MetadataObject contains the JSON metadata&amp;lt;br&amp;gt; for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| Content || &amp;lt;code&amp;gt;nielsenMeter.playheadPosition(pos);&amp;lt;/code&amp;gt; || // playheadPosition is position of the playhead &amp;lt;br&amp;gt;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;
=== SDK Events ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'play'	|| 	|| Call at start of each new stream&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
| 'playheadPosition'	|| playhead position as integer&amp;lt;br/&amp;gt;&lt;br /&gt;
VOD: current position in seconds &amp;lt;br/&amp;gt;&lt;br /&gt;
Live: current UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;lt;br/&amp;gt;&lt;br /&gt;
Note: 'PlayheadPosition' has to be called every second&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' ||	playhead position	|| Call during any interruption to content or Ad playback and at the end of each Ad.&lt;br /&gt;
|-&lt;br /&gt;
| 'end'	|| playhead position in seconds	|| Call when the current video asset completes playback and pass the playhead position. &amp;lt;br/&amp;gt;&lt;br /&gt;
Example: At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: For livestream, send the UNIX timestamp, for VOD send the time in seconds as integer. The final playhead position must be sent for the current asset being played before calling &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; or&amp;lt;code&amp;gt; '''loadmetadata'''&amp;lt;/code&amp;gt;,.&amp;lt;/blockquote&amp;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 '''Idle 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 an event to occur.&lt;br /&gt;
# '''Processing state''' – The SDK instance is processing playing information. The &amp;lt;code&amp;gt;'''play'''&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; 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;
## &amp;lt;code&amp;gt;'''playheadPosition'''&amp;lt;/code&amp;gt; – Call this API every one second when playhead position is active.  If a LIVE event, use the current UNIX timestamp (seconds since Jan-1-1970 UTC).&lt;br /&gt;
## &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt; – Call this API when the content or Ad playback is interrupted and at the end of each Ad. &lt;br /&gt;
## &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; – Call when content completes. When called, the SDK instance exits from Processing state.&lt;br /&gt;
# '''Disabled state''' – The SDK instance is disabled and is not processing playing information. &lt;br /&gt;
## &amp;lt;code&amp;gt;'''appDisableApi'''&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&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 &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; and   &amp;lt;code&amp;gt;'''playheadPosition'''&amp;lt;/code&amp;gt; &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()]] at start of stream&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;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 [[playheadPosition|playheadPosition()]] 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(); &amp;lt;/code&amp;gt; || // Call at start of each new stream&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;
|-style=&amp;quot;background-color:#d8f5d7;&amp;quot;&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;
| Interruption || &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // call stop when content playback is interrupted&lt;br /&gt;
|-style=&amp;quot;background-color:#d8f5d7;&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Resume Content || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt;  || // Call loadMetadata and pass content metadata object when content resumes&lt;br /&gt;
|- style=&amp;quot;background-color:#d8f5d7;&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // continue pasing playhead position every second starting from position where content is resumed&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()]] at start of stream&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;ad123&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 [[playheadPosition|playheadPosition()]] 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(); &amp;lt;/code&amp;gt; || // stream starts&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.playheadPosition(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;2&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.playheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&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.playheadPosition(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; || // Call stop after midroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Content Resumes || &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.playheadPosition(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; || // 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.playheadPosition(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 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;
{{iOS_Sequence_of_Calls}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_Foreground_and_Background}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_Interuptions_during_Playback}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_NielsenAppSDKJSHandler}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_PreCertification_Checklists}}&lt;br /&gt;
&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
There are currently 3 flavors of the Nielsen SDK: &lt;br /&gt;
# '''[[#Global_iOS_SDK_Opt-out|Global iOS SDK Opt-out]]''' - managed by ''AppTracking'' or ''Limit Ad Tracking'' setting on device ('''preferred approach''').&lt;br /&gt;
# '''[[#Global_iOS_SDK_No_Ad_Framework_Optout|Global iOS SDK No Ad Framework Optout]]''' - Direct call to SDK. Can be used without the Ad Framework&lt;br /&gt;
# '''[[#Global_iOS_SDK_No_ID_Optout_.28Kids_Category.29|Global iOS SDK No ID Optout]]''' - Direct call to SDK. Should be used for Kids Category.&lt;br /&gt;
&lt;br /&gt;
=== Global iOS SDK Opt-out ===&lt;br /&gt;
''OS-level Opt-out'' method available on Nielsen iOS &lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's '''Limit Ad Tracking''' or '''AppTracking''' setting. &lt;br /&gt;
*  If the User's device is running &amp;lt; iOS 13.x, the Nielsen SDK will check the status of '''Limit Ad Tracking'''.&lt;br /&gt;
*  iOS14 modifies the way Apple manages the collection of a User's Opt-In status through '''AppTracking'''. Starting with Version 8.x+, the Nielsen App SDK will check the iOS version during initialization. If the device is running iOS12 or iOS13, the Limit Ad Tracking setting is requested. If iOS14.x +, then AppTracking is utilized.&lt;br /&gt;
==== Webview Element ====&lt;br /&gt;
It is a requirement to display a WebView element whose loadUrl is set to the value obtained from optOutURL.&lt;br /&gt;
If using the Global iOS SDK, this optOutURL informs the user how to deactivate/activate “App Tracking/Limit Ad Tracking”.&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;&amp;quot;Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s Digital Content Ratings. Please see https://www.nielsen.com/th/en/legal/privacy-statement/digital-measurement/ for more information&amp;quot;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Global iOS SDK No Ad Framework Optout ===&lt;br /&gt;
The ''User Choice'' method can be used without the Ad Framework, or in situations where the publisher does not wish to use the [https://developer.apple.com/documentation/apptrackingtransparency App Tracking Transparency Framework]. As this flavor of the Nielsen SDK does not use the Ad Framework, so it is necessary to display an Optout Page to the userand capture their selection.&lt;br /&gt;
&lt;br /&gt;
Similar to the Global iOS SDK Flavor, it is a requirement to display a WebView element whose loadUrl is set to the&lt;br /&gt;
value obtained from optOutURL. This is a special URL that indicates Opt-in, or Opt-out and close the WebView.&lt;br /&gt;
&lt;br /&gt;
==== This opt-out method works as follows: ====&lt;br /&gt;
* Get the 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;
=== Global iOS SDK No ID Optout (Kids Category) ===&lt;br /&gt;
If you are building an app that will be listed in the Kids Category:&lt;br /&gt;
#  Ensure that you are using the [https://nielsendownloads-green.digitalengsdk.com/digital/Nielsen-iOS-App-SDK-GlobalNoId_latest.zip NoID version] of the Nielsen SDK Framework.&lt;br /&gt;
#  Immediately following the initialization of the Nielsen SDK ensure you call the userOptOut API with Opt out selection: &lt;br /&gt;
&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;
== Opt-out example code ==&lt;br /&gt;
===== Swift =====&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;
    var nielsenApi : NielsenAppApi!&lt;br /&gt;
    var webView: WKWebView!&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;
&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;
        func closeOptOutView() {&lt;br /&gt;
            self.dismiss(animated: true, completion: nil)&lt;br /&gt;
        }&lt;br /&gt;
  &lt;br /&gt;
// Uncomment below code if you are using the Global iOS SDK No Ad Framework Flavor.  This will receive the user's selection&lt;br /&gt;
// From the custom User_Choice opt out page.  Only required for non-ad framework or no-id builds&lt;br /&gt;
// of the Nielsen SDK&lt;br /&gt;
/*  &lt;br /&gt;
        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: &lt;br /&gt;
@escaping (WKNavigationActionPolicy) -&amp;gt; Void) {&lt;br /&gt;
            print(navigationAction.request.url?.absoluteString as Any) //For debugging to check what is being passed from webpage.&lt;br /&gt;
            if navigationAction.request.url?.absoluteString == &amp;quot;nielsen://close&amp;quot; {&lt;br /&gt;
                closeOptOutView()&lt;br /&gt;
                decisionHandler(.cancel)&lt;br /&gt;
            } else {&lt;br /&gt;
                if let url = navigationAction.request.url?.absoluteString, url.hasPrefix(&amp;quot;nielsen&amp;quot;) {&lt;br /&gt;
                    nielsenApi?.userOptOut(url). //either nielsenappsdk://1 or nielsenappsdk://0&lt;br /&gt;
                    decisionHandler(.cancel)&lt;br /&gt;
                } else {&lt;br /&gt;
                    if navigationAction.navigationType == .linkActivated {&lt;br /&gt;
                        if let url = navigationAction.request.url?.absoluteString, url.hasSuffix(&amp;quot;#&amp;quot;) {&lt;br /&gt;
                            decisionHandler(.allow)&lt;br /&gt;
                        } else {&lt;br /&gt;
                            decisionHandler(.cancel)&lt;br /&gt;
                            webView.load(navigationAction.request)&lt;br /&gt;
                        }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        decisionHandler(.allow)&lt;br /&gt;
                    }}}}&lt;br /&gt;
  */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Objective-C =====&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;OptOutVC.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.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;
@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;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    //Getting the optPut URL from eventTracker&lt;br /&gt;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL&lt;br /&gt;
 URLWithString:self.nielsenApi.optOutURL]]];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Uncomment below code if you are using the Global iOS SDK No Ad Framework Flavor.&lt;br /&gt;
// From the custom User_Choice opt out page.  Only required for non-ad framework or no-id builds&lt;br /&gt;
// of the Nielsen SDK&lt;br /&gt;
/*     &lt;br /&gt;
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction&lt;br /&gt;
 decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler&lt;br /&gt;
{&lt;br /&gt;
    if ([navigationAction.request.URL.absoluteString isEqualToString:kNielsenWebClose])&lt;br /&gt;
    {   [self performSelector:@selector(closeOptOutView) withObject:nil afterDelay:0];&lt;br /&gt;
        decisionHandler(WKNavigationActionPolicyCancel); &lt;br /&gt;
     } else {&lt;br /&gt;
        if ([navigationAction.request.URL.absoluteString hasPrefix:@&amp;quot;nielsen&amp;quot;])&lt;br /&gt;
        {[self.nielsenAppApi userOptOut:navigationAction.request.URL.absoluteString];&lt;br /&gt;
            decisionHandler(WKNavigationActionPolicyCancel); &lt;br /&gt;
        } else {&lt;br /&gt;
            if (navigationAction.navigationType == WKNavigationTypeLinkActivated) &lt;br /&gt;
            { if ([navigationAction.request.URL.absoluteString hasSuffix:@&amp;quot;#&amp;quot;]) &lt;br /&gt;
                      {decisionHandler(WKNavigationActionPolicyAllow);&lt;br /&gt;
                } else {&lt;br /&gt;
                    decisionHandler(WKNavigationActionPolicyCancel);&lt;br /&gt;
                    [webView loadRequest:[NSURLRequest requestWithURL:navigationAction.request.URL]];&lt;br /&gt;
                }} else {&lt;br /&gt;
                 decisionHandler(WKNavigationActionPolicyAllow);&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;
== Retrieve current Opt-Out preference ==&lt;br /&gt;
Whether the user is opted out via OS-level Opt-out or via User Choice Opt-out, the current Opt-Out status as detected by the SDK is available via the [[optOutStatus]] property in the Nielsen SDK API&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;
&lt;br /&gt;
{{iOS_Airplay}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_Going_Live}}&lt;br /&gt;
&lt;br /&gt;
{{iOS_Removing_Simulator_Slices}}&lt;br /&gt;
&lt;br /&gt;
== Sample Applications ==&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;
** [[Swift Basic Sample|Swift 5.0 Sample]]&lt;br /&gt;
** [[Objective-c Basic example|Objective-C Sample]]&lt;br /&gt;
&lt;br /&gt;
* '''Advanced''' - Nielsen Simplified API integrated into a custom video player.&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_Video_webOS&amp;diff=6593</id>
		<title>Digital Measurement Video webOS</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_Video_webOS&amp;diff=6593"/>
		<updated>2024-03-27T02:53:08Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &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;
__NOTOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The following document will highlight the steps needed to run Browser SDK (BSDK) on LG Smart TVs that are currently running webOS TV 23 on Chromium 94 web engine&lt;br /&gt;
&lt;br /&gt;
The tutorial should be used in combination with the documentation at [https://webostv.developer.lge.com/develop/getting-started/build-your-first-web-app webOS TV Developer] to build an app and verify that the BSDK properly measures  the video and  static content. In the tutorial we will be using a [https://webostv.developer.lge.com/develop/getting-started/web-app-types#hosted-web-app hosted web app] which will host the content on the web server. We will also use the [https://webostv.developer.lge.com/develop/tools/simulator-introduction webOS TV Simulator] for app development.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Install the webOS TV CLI ==&lt;br /&gt;
&lt;br /&gt;
Navigate [https://webostv.developer.lge.com/develop/tools/simulator-installation here] and install the webOS TV CLI&lt;br /&gt;
&lt;br /&gt;
== Step 2: Install the webOS TV Simulator ==&lt;br /&gt;
&lt;br /&gt;
Navigate [https://webostv.developer.lge.com/develop/tools/simulator-installation here] and install the webOS TV Simulator&lt;br /&gt;
&lt;br /&gt;
== Step 3: Create App ==&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
# We will begin creating the app by navigating [https://webostv.developer.lge.com/develop/getting-started/web-app-types#hosted-web-app here] and following the installation steps:&lt;br /&gt;
# Run &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; ares-generate -t hosted_webapp nlsn-bsdk-webOS &amp;lt;/syntaxhighlight&amp;gt; to generate the app and accept all defaults&lt;br /&gt;
# Open  the generated folder in a text editor or IDE and and create a new folder called app&lt;br /&gt;
# Add the following into a video.html file and make sure to update App ID with Nielsen provided App ID while creating the SDK instance&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&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;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=edge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;DCR Video webOS Sample&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        // Static Queue Snippet&lt;br /&gt;
        !function (e, n) {&lt;br /&gt;
            function t(e) {&lt;br /&gt;
                return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
            }&lt;br /&gt;
            e[n] = e[n] ||&lt;br /&gt;
            {&lt;br /&gt;
                nlsQ: function (o, r, c) {&lt;br /&gt;
                    var s = e.document,&lt;br /&gt;
                        a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
                    a.async = 1,&lt;br /&gt;
                        a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
                    var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
                    return i.parentNode.insertBefore(a, i),&lt;br /&gt;
                        e[n][r] = e[n][r] || {&lt;br /&gt;
                            g: c || {},&lt;br /&gt;
                            ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
                            trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
                        },&lt;br /&gt;
                        e[n][r]&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
}(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // INSERT CLIENT APP ID&lt;br /&gt;
        var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;videoSdkInstance&amp;quot;, {&lt;br /&gt;
            nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        var contentMetadata = {&lt;br /&gt;
            type: 'content',&lt;br /&gt;
            assetid: 'VID-123456',&lt;br /&gt;
            program: 'program name',&lt;br /&gt;
            title: 'episode title with season and episode number',&lt;br /&gt;
            length: 'length in seconds',&lt;br /&gt;
            airdate: '20210321 09:00:00',&lt;br /&gt;
            isfullepisode: 'y',&lt;br /&gt;
            adloadtype: '2'&lt;br /&gt;
        };&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
        body {&lt;br /&gt;
            background-color: white;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;DCR Video webOS Sample App&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
      &amp;lt;video controls src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
        poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot; width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
             Sorry, your browser doesn't support embedded videos,&lt;br /&gt;
             but don't worry, you can &amp;lt;a&lt;br /&gt;
     href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
        and watch it with your favorite video player!&lt;br /&gt;
      &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        var media = document.querySelector('video');&lt;br /&gt;
        var playheadPosition = 0;&lt;br /&gt;
        var metadataLoaded = false;&lt;br /&gt;
&lt;br /&gt;
        // Loadmetadata&lt;br /&gt;
        // Load contentMetadata object&lt;br /&gt;
        media.addEventListener('loadedmetadata', (event) =&amp;gt; {&lt;br /&gt;
            // Call SDK loadmetadata event&lt;br /&gt;
            if (!metadataLoaded) {&lt;br /&gt;
                nSdkInstance.ggPM(&amp;quot;loadmetadata&amp;quot;, contentMetadata);&lt;br /&gt;
                metadataLoaded = true;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        media.addEventListener('play', (event) =&amp;gt; {&lt;br /&gt;
            // Call SDK play event&lt;br /&gt;
            if (!metadataLoaded) {&lt;br /&gt;
                nSdkInstance.ggPM(&amp;quot;loadmetadata&amp;quot;, contentMetadata);&lt;br /&gt;
                metadataLoaded = true;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Player paused&lt;br /&gt;
        media.addEventListener('pause', function (e) {&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;pause&amp;quot;, playheadPosition);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Set playhead position&lt;br /&gt;
        media.addEventListener('timeupdate', function (e) {&lt;br /&gt;
            var currTime = Math.floor(media.currentTime);&lt;br /&gt;
            if (playheadPosition &amp;lt; currTime) {&lt;br /&gt;
                playheadPosition = currTime;&lt;br /&gt;
                nSdkInstance.ggPM(&amp;quot;setplayheadposition&amp;quot;, playheadPosition);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // End&lt;br /&gt;
        media.addEventListener('ended', function (e) {&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;end&amp;quot;, playheadPosition);&lt;br /&gt;
            metadataLoaded = false;&lt;br /&gt;
            playheadPosition = 0;&lt;br /&gt;
        });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Click [https://gitlab.com/nielsen-media/digital/shared/sdk/browser-sdk/misc/bsdk-client-documentation/-/wikis/DCR-Video-Quick-Start here] for more information on DCR Video implementation.&lt;br /&gt;
&lt;br /&gt;
  3. Navigate to &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; index.html &amp;lt;/syntaxhighlight&amp;gt; at the root of the directory and update the &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; location.href &amp;lt;/syntaxhighlight&amp;gt; url to point to &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; http://{{LOCAL_SERVER_URL}}/app/video.html &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That is all that we need to run the app on the webOS TV Simulator. Please make sure to update the App ID for SDK initialization to view proper crediting&lt;br /&gt;
&lt;br /&gt;
== Step 4: Open up webOS TV Simulator ==&lt;br /&gt;
&lt;br /&gt;
Open up the webOS TV Simulator &amp;gt; navigate to File &amp;gt; Launch App &amp;gt; open the folder containing the app created in the previous step &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:WEBOS 1.png||600px|center|]]&lt;br /&gt;
&lt;br /&gt;
== Step 5: Debug app ==&lt;br /&gt;
Click on the Inspect button on the remote to open up developer tools &amp;gt; navigate to the Console tab &amp;gt; check for BSDK initialization and measurement.&lt;br /&gt;
[[File:LGwebos 2.png||600px|center|]]&lt;br /&gt;
&lt;br /&gt;
Note - Debug Logging: Disable logging by deleting &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; {nol_sdkDebug: 'debug'} &amp;lt;/syntaxhighlight&amp;gt; from initialization call.&lt;br /&gt;
&lt;br /&gt;
== Remote events ==&lt;br /&gt;
Build out the app further by including [https://webostv.developer.lge.com/develop/guides/magic-remote remote events] and attaching the player events to corresponding &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; keycode: &amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var media = document.querySelector('video');&lt;br /&gt;
window.addEventListener(&amp;quot;keydown&amp;quot;, function (e) {&lt;br /&gt;
    switch (e.keyCode) {&lt;br /&gt;
        case 415: // Play&lt;br /&gt;
            media.play(); // play video&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;play&amp;quot;, contentMetadata); // SDK call&lt;br /&gt;
            break;&lt;br /&gt;
        case 19: // Pause&lt;br /&gt;
            media.pause(); // play video&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;pause&amp;quot;, playheadPosition); // SDK call&lt;br /&gt;
            break;&lt;br /&gt;
        case 461: // Back&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;stop&amp;quot;, playheadPosition); // SDK call&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&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;
&lt;br /&gt;
== Next steps ==&lt;br /&gt;
&lt;br /&gt;
For further testing on webOS TV apps on the TV, refer to this [https://webostv.developer.lge.com/develop/getting-started/developer-mode-app guide]. If there are any questions or concerns then please reach out to BSDK team. Reference the following guides for product specific information:&lt;br /&gt;
&lt;br /&gt;
* [https://engineeringportal.nielsen.com/docs/DCR_Video_Browser_SDK DCR Video]&lt;br /&gt;
* [https://engineeringportal.nielsen.com/docs/DCR_Static_Browser_SDK_(6.0.0) DCR Static]&lt;br /&gt;
* [https://engineeringportal.nielsen.com/docs/DTVR_Browser_SDK DTVR]&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_Video_TizenTv&amp;diff=6592</id>
		<title>Digital Measurement Video TizenTv</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_Video_TizenTv&amp;diff=6592"/>
		<updated>2024-03-27T02:52:30Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: Created page with &amp;quot;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}} Category:Digital  __NOTOC__ == Introduction == The following document will highlight the steps needed to run Browser SDK (BSDK) on Samsung Smart TV using TIzen Studio for app development. The tutorial should be used in conjunction with the documentation at [https://docs.tizen.org/application/web/get-started/tv/first-samsung-tv-app/ Create Your First Samsung Smart TV Web Applicatio...&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;
__NOTOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The following document will highlight the steps needed to run Browser SDK (BSDK) on Samsung Smart TV using TIzen Studio for app development.&lt;br /&gt;
The tutorial should be used in conjunction with the documentation at [https://docs.tizen.org/application/web/get-started/tv/first-samsung-tv-app/ Create Your First Samsung Smart TV Web Application] to build an app with BSDK integration for content measurement. In this tutorial we will create a native app and highlight the different permissions required to run the BSDK.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Install Tizen Studio ==&lt;br /&gt;
&lt;br /&gt;
Navigate [https://developer.tizen.org/development/tizen-studio/download here] and install Tizen Studio.&lt;br /&gt;
During installation make sure to install the '''TV Extensions package''' from the Package Manager.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Generate Security Profile ==&lt;br /&gt;
&lt;br /&gt;
Navigate [https://docs.tizen.org/application/tizen-studio/common-tools/certificate-registration here] and generate the security profile in order to run applications.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Create Basic Project ==&lt;br /&gt;
&lt;br /&gt;
Follow the [https://docs.tizen.org/application/web/get-started/tv/first-samsung-tv-app/ step-by-step guide] and create the Basic Project template. &lt;br /&gt;
Replace the code in the&amp;lt;syntaxhighlight&amp;gt;index.html&amp;lt;/syntaxhighlight&amp;gt;file with the code snippet below and update the App ID with a Nielsen provided App ID during SDK initialization.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=edge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;DCR Video Tizen Sample&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        // Static Queue Snippet&lt;br /&gt;
        !function (e, n) {&lt;br /&gt;
            function t(e) {&lt;br /&gt;
                return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
            }&lt;br /&gt;
            e[n] = e[n] ||&lt;br /&gt;
            {&lt;br /&gt;
                nlsQ: function (o, r, c) {&lt;br /&gt;
                    var s = e.document,&lt;br /&gt;
                        a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
                    a.async = 1,&lt;br /&gt;
                        a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
                    var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
                    return i.parentNode.insertBefore(a, i),&lt;br /&gt;
                        e[n][r] = e[n][r] || {&lt;br /&gt;
                            g: c || {},&lt;br /&gt;
                            ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
                            trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
                        },&lt;br /&gt;
                        e[n][r]&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Replace (PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) with CLIENT APP ID&lt;br /&gt;
        var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;videoSdkInstance&amp;quot;, {&lt;br /&gt;
            nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        var contentMetadata = {&lt;br /&gt;
            type: 'content',&lt;br /&gt;
            assetid: 'VID-123456',&lt;br /&gt;
            program: 'program name',&lt;br /&gt;
            title: 'episode title with season and episode number',&lt;br /&gt;
            length: 'length in seconds',&lt;br /&gt;
            airdate: '20210321 09:00:00',&lt;br /&gt;
            isfullepisode: 'y',&lt;br /&gt;
            adloadtype: '2'&lt;br /&gt;
        };&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
        body {&lt;br /&gt;
            background-color: white;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;DCR Video Tizen Sample App&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
      &amp;lt;video controls src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
        poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot; width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Sorry, your browser doesn't support embedded videos,&lt;br /&gt;
        but don't worry, you can &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
        and watch it with your favorite video player!&lt;br /&gt;
      &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        var media = document.querySelector('video');&lt;br /&gt;
        var playheadPosition = 0;&lt;br /&gt;
        var metadataLoaded = false;&lt;br /&gt;
&lt;br /&gt;
        // Loadmetadata&lt;br /&gt;
        // Load contentMetadata object&lt;br /&gt;
        media.addEventListener('loadedmetadata', (event) =&amp;gt; {&lt;br /&gt;
            // Call SDK loadmetadata event&lt;br /&gt;
            if (!metadataLoaded) {&lt;br /&gt;
                nSdkInstance.ggPM(&amp;quot;loadmetadata&amp;quot;, contentMetadata);&lt;br /&gt;
                metadataLoaded = true;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        media.addEventListener('play', (event) =&amp;gt; {&lt;br /&gt;
            // Call SDK play event&lt;br /&gt;
            if (!metadataLoaded) {&lt;br /&gt;
                nSdkInstance.ggPM(&amp;quot;loadmetadata&amp;quot;, contentMetadata);&lt;br /&gt;
                metadataLoaded = true;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Player paused&lt;br /&gt;
        media.addEventListener('pause', function (e) {&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;pause&amp;quot;, playheadPosition);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Set playhead position&lt;br /&gt;
        media.addEventListener('timeupdate', function (e) {&lt;br /&gt;
            var currTime = Math.floor(media.currentTime);&lt;br /&gt;
            if (playheadPosition &amp;lt; currTime) {&lt;br /&gt;
                playheadPosition = currTime;&lt;br /&gt;
                nSdkInstance.ggPM(&amp;quot;setplayheadposition&amp;quot;, playheadPosition);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // End&lt;br /&gt;
        media.addEventListener('ended', function (e) {&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;end&amp;quot;, playheadPosition);&lt;br /&gt;
            metadataLoaded = false;&lt;br /&gt;
            playheadPosition = 0;&lt;br /&gt;
        });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Step 4: Run Project==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Right click on the project &amp;gt; Run As &amp;gt; Tizen Web Simulator Application (Samsung TV)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Tizen 1 Step4.png||600px|center|]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Extra configurations must be done to run and debug the application on a Target Device, please reference the following [[TizenTv_Debugging|guide]] for more information&lt;br /&gt;
&lt;br /&gt;
== Step 5: Debug App==&lt;br /&gt;
Right click anywhere in the Simulator to open the Web Inspector &amp;gt; navigate to the Console tab &amp;gt; check for BSDK initialization and content measurement.&lt;br /&gt;
[[File:Tizen 1 Step5.png||600px|center|]]&lt;br /&gt;
&lt;br /&gt;
Debug Logging: Disable logging by deleting &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{nol_sdkDebug: 'debug'}&amp;lt;/syntaxhighlight&amp;gt; from initialization call&lt;br /&gt;
&lt;br /&gt;
== Remote control events ==&lt;br /&gt;
Build out the app further by including [https://developer.samsung.com/smarttv/develop/guides/user-interaction/remote-control.html remote control events] and attaching the player events to corresponding &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;keyCode &amp;lt;/syntaxhighlight&amp;gt; or using Tizen registered keys:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var media = document.querySelector('video');&lt;br /&gt;
window.addEventListener(&amp;quot;keydown&amp;quot;, function (e) {&lt;br /&gt;
    switch (e.keyCode) {&lt;br /&gt;
        case 10252: // MediaPlayPause&lt;br /&gt;
            if(!media.paused) {&lt;br /&gt;
                media.pause(); // pause video&lt;br /&gt;
                nSdkInstance.ggPM(&amp;quot;pause&amp;quot;, playheadPosition); // SDK call&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            media.play(); // play video&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;play&amp;quot;, contentMetadata); // SDK call&lt;br /&gt;
            break;&lt;br /&gt;
        case 10009: // Back&lt;br /&gt;
            nSdkInstance.ggPM(&amp;quot;stop&amp;quot;, playheadPosition); // SDK call&lt;br /&gt;
            break;&lt;br /&gt;
        ...&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Next steps ==&lt;br /&gt;
&lt;br /&gt;
For further testing Samsung Tizen TV apps, refer to this [https://docs.tizen.org/application/web/tutorials/process/run-debug-app/ guide]. If there are any questions or concerns then please reach out to the BSDK team. Reference the following guides for product specific information:&lt;br /&gt;
&lt;br /&gt;
* [https://engineeringportal.nielsen.com/docs/DCR_Video_Browser_SDK DCR Video]&lt;br /&gt;
* [https://engineeringportal.nielsen.com/docs/DCR_Static_Browser_SDK_(6.0.0) DCR Static]&lt;br /&gt;
* [https://engineeringportal.nielsen.com/docs/DTVR_Browser_SDK DTVR]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For further technical details or a sample application, please contact your Technical Account Manager (TAM).&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=US_DCR_%26_DTVR&amp;diff=6591</id>
		<title>US DCR &amp; DTVR</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=US_DCR_%26_DTVR&amp;diff=6591"/>
		<updated>2024-03-27T02:51:51Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
{{CategoryIcon|DCR.png|US Digital Content Ratings (DCR) &amp;amp; Digital in TV Ratings (DTVR)}}&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Start Here&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | {{SmallIcon|thePlatformIcon.png}}&lt;br /&gt;
| '''Step-By-Step SDK Integration Guides ([[BSDK Step By Step|Browser]], [[Android Step By Step|Android]], [[iOS Step By Step|iOS]])'''&lt;br /&gt;
| '''API Reference Tables ([[Browser_SDK_API_Table|Browser]], [[Android_SDK_API_Table|Android]], [[iOS_SDK_API_Table|iOS]])'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[DCR_vs_DTVR|DCR vs. DTVR Implementation - Key Differences]]'''&lt;br /&gt;
| '''Product Information - [https://markets.nielsen.com/us/en/solutions/capabilities/digital-content-ratings/ DCR], [https://www.nielsen.com/solutions/audience-measurement/national-tv/ DTVR]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| General Reference&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Measurement Onboarding]]'''&lt;br /&gt;
| '''[[Digital Measurement Metadata]]'''&lt;br /&gt;
| '''[[Digital Measurement Testing]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Measurement Interruption Scenarios]]'''&lt;br /&gt;
| '''[[Digital Measurement FAQ]]'''&lt;br /&gt;
| '''SDK Release Notes - [[Browser_SDK_Release_Notes|Browser]], [[Android_SDK_Release_Notes|Android]], [[iOS_SDK_Release_Notes|iOS]], [[TVOS_SDK_Release_Notes|TVOS]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Pre-Certification Checklist App SDK]]'''&lt;br /&gt;
| '''[[Digital Pre-Certification Checklist Browser SDK]]'''&lt;br /&gt;
| '''[[Digital Measurement Persistent Identifiers]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK - Video ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Maintaining an existing ''DCR'' or ''DTVR'' App integration? Continue to reference the API you're already using with the guides below.&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
! style=&amp;quot;width: 30%;&amp;quot; | DCR Implementation Guide&lt;br /&gt;
! style=&amp;quot;width: 25%;&amp;quot; | DTVR Implementation Guide&lt;br /&gt;
!| SDK Documentation&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR Video iOS SDK]]'''&lt;br /&gt;
| '''[[DTVR iOS SDK]]'''&lt;br /&gt;
| [[iOS SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR Video Android SDK]]'''&lt;br /&gt;
| '''[[DTVR Android SDK]]'''&lt;br /&gt;
| [[Android SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR Video Browser SDK]]'''&lt;br /&gt;
| '''[[DTVR Browser SDK]]'''&lt;br /&gt;
| [[Browser SDK API Reference]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK - Static ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
! style=&amp;quot;width: 55%;&amp;quot; | DCR Implementation Guide&lt;br /&gt;
!| SDK Documentation&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{OSIcon|StaticIcon.png|alt=Static Content}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR Static iOS SDK]]'''&lt;br /&gt;
| [[iOS SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR Static Android SDK]]'''&lt;br /&gt;
| [[Android SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR Static Browser SDK]]'''&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | [[Browser SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| '''[[DCR Static Lite Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|GoogleTagManagerIcon.png|alt=Google Tag Manager}}&lt;br /&gt;
| '''[[DCR Static Google Tag Manager]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|FacebookIcon.png|alt=Facebook Instant Articles}}&lt;br /&gt;
| '''[[DCR Static Facebook Instant Articles Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|Tealium_Icon.png|alt=Tealium}}&lt;br /&gt;
| '''[[DCR Static Tealium]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|AMPIcon.png|alt=Google AMP}}&lt;br /&gt;
| '''[[DCR Static Google AMP Cloud API]]'''&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Xamarin ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Xamarin Integration Guides (Xamarin support is part of [[Special:Downloads|Nielsen's AppSDK V8]] and above.)&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Xamarin}}&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | '''[[DCR_%26_DTVR_Xamarin_Integration|DCR &amp;amp; DTVR Xamarin Integration]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cloud API ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| DCR Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|CloudAPIIcon.png|alt=Cloud API}} &lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |&lt;br /&gt;
{{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|StaticIcon.png|alt=Static Content}}&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Cloud API}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Cloud API ]]''' &lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Cloud API}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Mobile Cloud API ]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|RokuIcon.png|alt=Roku}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Roku Cloud API]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Adobe Launch Extensions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Leverage Launch by Adobe? The guides below describe how to integrate DCR and DTVR with Nielsen's Adobe Launch extension&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | '''[[Digital Measurement Onboarding Adobe ]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR iOS Adobe Launch Extension]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR Android Adobe Launch Extension]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR Browser Adobe Launch Extension]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SmartTV Integrations ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | The guides below describe how to integrate DCR and DTVR with Smart tv's&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
! | Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[TizenTv]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[webOS]]'''&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DCR_Static_Browser_SDK_(6.0.0)&amp;diff=6590</id>
		<title>DCR Static Browser SDK (6.0.0)</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DCR_Static_Browser_SDK_(6.0.0)&amp;diff=6590"/>
		<updated>2024-03-27T02:50:39Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|US DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following items are required:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
|| ☑ || '''App ID (appid)''' || Unique ID assigned to the player/site and configured by product. || Contact Nielsen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
The release notes on the Browser SDK can be located here: '''[[Browser SDK Release Notes|Release Notes]]'''&lt;br /&gt;
&lt;br /&gt;
== Implementation Steps ==&lt;br /&gt;
=== Add Tracking Code ===&lt;br /&gt;
The Nielsen DCR Tracking Code must be added to each page.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // Static Queue Snippet&lt;br /&gt;
! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
        nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
            return s = t.document, r = s.createElement(&amp;quot;script&amp;quot;), r.async = 1, r.src =&lt;br /&gt;
                (&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; +&lt;br /&gt;
                e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                i.parentNode.insertBefore(r, i), t[n][o] = t[n][o] || {&lt;br /&gt;
                    g: c || {},&lt;br /&gt;
                    ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                        (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                    }&lt;br /&gt;
                }, t[n][o]}}}&lt;br /&gt;
(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // SDK Initialization&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
    nol_sdkDebug: &amp;quot;debug&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
  &lt;br /&gt;
  // Content Metadata &lt;br /&gt;
  var nielsenMetadata = {&lt;br /&gt;
    type: 'static', &lt;br /&gt;
    assetid: 'HHF887465-9486', // *DYNAMIC METADATA*: unique ID for each article **REQUIRED**&lt;br /&gt;
    section: 'SPORTS', // *DYNAMIC METADATA*: section of site **REQUIRED**&lt;br /&gt;
    segA: 'HDVIDEOS', // *DYNAMIC METADATA*: custom segment&lt;br /&gt;
    segB: '', // *DYNAMIC METADATA*: custom segment&lt;br /&gt;
    segC: ''  // *DYNAMIC METADATA*: custom segment&lt;br /&gt;
    }; &lt;br /&gt;
    &lt;br /&gt;
  // Event 'staticstart' Call&lt;br /&gt;
  nSdkInstance.ggPM(&amp;quot;staticstart&amp;quot;, nielsenMetadata);&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;For DCR static, BSDK cannot be run in an iframe because the blur/focus events of the parent page may not propagate to the iframe. The iframe events typically trigger when the iframe itself is clicked. The BSDK is dependent on the blur/focus events of the browser to detect active viewing of the page. Because the root page events do not propagate to the iframe, this would impact incorrect DCR static crediting.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tracking Code Components ===&lt;br /&gt;
The tracking code includes&lt;br /&gt;
* Static Queue Snippet&lt;br /&gt;
* SDK Initialization&lt;br /&gt;
* Content Metadata&lt;br /&gt;
* staticstart Event&lt;br /&gt;
&lt;br /&gt;
'''Static Queue Snippet'''&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;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
        nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
            return s = t.document, r = s.createElement(&amp;quot;script&amp;quot;), r.async = 1, r.src =&lt;br /&gt;
                (&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; +&lt;br /&gt;
                e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                i.parentNode.insertBefore(r, i), t[n][o] = t[n][o] || {&lt;br /&gt;
                    g: c || {},&lt;br /&gt;
                    ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                        (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                    }&lt;br /&gt;
                }, t[n][o]}}}&lt;br /&gt;
(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SDK Initialization'''&lt;br /&gt;
&lt;br /&gt;
While creating an SDK instance, initialize the SDK by calling:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX&amp;quot;, &amp;quot;&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 config file, &amp;lt;code&amp;gt;&amp;lt;apid&amp;gt;.js&amp;lt;/code&amp;gt;, will be downloaded based on the &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; and cached by the client-side browser(s).&lt;br /&gt;
&lt;br /&gt;
Once the static config file is downloaded, the SDK will be fully downloaded and initialized. All SDK modules are included in one file:&lt;br /&gt;
&amp;quot;nlsSDK600.bundle.min.js&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Content Metadata'''&lt;br /&gt;
&lt;br /&gt;
Metadata can be passed through key-values using the Nielsen reserved keys. The tracking code includes the Nielsen reserved keys and placeholder values.&lt;br /&gt;
&lt;br /&gt;
Pass dynamic metadata for the keys with the &amp;lt;code&amp;gt;&amp;lt;metadataPlaceholder&amp;gt;&amp;lt;/code&amp;gt; value (e.g. &amp;lt;code&amp;gt;section: ''&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
'''staticstart Event'''&lt;br /&gt;
&lt;br /&gt;
There is only one event call required:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;nSdkInstance.ggPM(&amp;quot;staticstart&amp;quot;, nielsenMetadata);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The content metadata object is passed as a parameter when calling 'staticstart' event . To know more about configuring metadata refer [[DCR_Static_Browser_SDK_(6.0.0)#Configure_Metadata|Configure Metadata]].&lt;br /&gt;
&lt;br /&gt;
=== Pass App ID in Initialization Call ===&lt;br /&gt;
Pass the unique App ID in the first parameter of the initialization call, &amp;lt;code&amp;gt;&amp;lt;apid&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX&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;
The initialization call has three parameters:&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;
Update &amp;lt;code&amp;gt;&amp;lt;apid&amp;gt;&amp;lt;/code&amp;gt; with the AppID provided. Refer to the [[#Going_Live|Going Live]] section to know about updating the AppID to production after testing is completed.&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Metadata}}&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Infinite Scrolling ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;onPaginate&amp;lt;/code&amp;gt; will refire the view ping with the existing/original metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;nSdkInstance.ggPM(&amp;quot;onPaginate&amp;quot;, scrolloffset);&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;23%&amp;quot;| Parameter&lt;br /&gt;
!width=&amp;quot;19%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| event&lt;br /&gt;
| &amp;lt;code&amp;gt;onPaginate&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| scrolloffset&lt;br /&gt;
| The &amp;lt;code&amp;gt;scrolloffset&amp;lt;/code&amp;gt; value should be the y-scroll position:&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== onPaginate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;onPageinate&amp;lt;/code&amp;gt; is a slightly modified version of &amp;lt;code&amp;gt;staticstart&amp;lt;/code&amp;gt; to enable tracking of user’s focus in pages with continuous scrolling. &amp;lt;code&amp;gt;onPaginate&amp;lt;/code&amp;gt; event provides the same behavior as &amp;lt;code&amp;gt;staticstart&amp;lt;/code&amp;gt; keeping it local to only clients who wish to implement continuous scrolling. (Note: This event &amp;lt;code&amp;gt;onPaginate&amp;lt;/code&amp;gt; will not reset the page duration timer.)&lt;br /&gt;
&lt;br /&gt;
* The maximum number of static View pings allowed per session is ‘1’. This is enforced via the &amp;lt;code&amp;gt;nol_maxPingCount&amp;lt;/code&amp;gt; parameter in the tag and the cadence of impression.&lt;br /&gt;
* When an &amp;lt;code&amp;gt;onPaginate&amp;lt;/code&amp;gt; event is called at the end of section / a focus shift (within the same page), this filter will reset the current ping count to ‘0’ for the static View ping. This change of value will cause a new View ping when the Browser SDK receives the next &amp;lt;code&amp;gt;staticPosition&amp;lt;/code&amp;gt; event (at the section end). This sequence continues through the end of scrolling or till the close of static page session.&lt;br /&gt;
*One of the following must occur before an onPaginate event should be sent : user-initiated action, more than 50% of the content has changed or an ad, or the potential for an ad, is being loaded&lt;br /&gt;
&lt;br /&gt;
[[File:StaticPageEvent35.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
Once the DCR Tracking Code is added, 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>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=DCR_Static_iOS_SDK&amp;diff=6589</id>
		<title>DCR Static iOS SDK</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=DCR_Static_iOS_SDK&amp;diff=6589"/>
		<updated>2024-03-27T02:50:22Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|US DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&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]]), and [[Digital Ad Ratings]] (DAR). 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;
*How long each app page/section was viewed (if enabled by your Nielsen representative)&lt;br /&gt;
&lt;br /&gt;
== Prerequisites for Static Measurement==&lt;br /&gt;
This Guide is for the Implementation of Static Measurement.  For implementation of Static and Video, please refer to the [[DCR_Video_iOS_SDK|iOS DCR Video Implementation Guide]]. &amp;lt;br&amp;gt;&lt;br /&gt;
To start using the App SDK, the following items are required:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-&lt;br /&gt;
 || '''App ID (appid)''' || Unique ID assigned to the player/site and configured by product. || Contact Nielsen&lt;br /&gt;
|-&lt;br /&gt;
 || '''sfcode''' || Environment that the SDK must point to || Contact Nielsen&lt;br /&gt;
|-&lt;br /&gt;
 || '''Nielsen SDK''' || Includes SDK frameworks and '''sample implementation'''; ''See [[iOS SDK Release Notes]]'' || [[Special:Downloads|Download]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If you do not have any of these pre-requisites 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;
___TOC___&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode utilizing the Standard Nielsen SDK for DCR.&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_.28Dynamic_Framework_Only.29|found here]].&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 CocoaPods. We recommend using the CocoaPods-based integration whenever possible to ensure you maintain the most recent changes and enhancements to the Nielsen libraries.&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain CocoaPods implementation guide]]&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&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, when using the dynamic framework,  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. (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
=== Add Framework ===&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.  (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
=== Add Path ===&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.  (''Not required if using CocaPods'')&lt;br /&gt;
&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;
Add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
@import NielsenAppApi;&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. [[Dual_Instances_of_SDK|(Click here for an example of multiple instances)]]&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 || Optional; automatically detected in SDK 6.0.0.4 and above || Nielsen Sample App&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;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || dcr&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;
&lt;br /&gt;
== Debug flag for development environment ==&lt;br /&gt;
Player application developers / integrators can use Debug flag to check whether an App SDK API call made is successful. To activate the Debug flag,&lt;br /&gt;
Pass the argument &amp;lt;code&amp;gt;@&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;INFO&amp;quot;&amp;lt;/code&amp;gt;, in the JSON string . The permitted values are:&lt;br /&gt;
&lt;br /&gt;
* '''INFO''': Displays the API calls and the input data from the application (validate player name, app ID, etc.). It can be used as certification Aid.&lt;br /&gt;
* '''WARN''': Indicates potential integration / configuration errors or SDK issues.&lt;br /&gt;
* '''ERROR''': Indicates important integration errors or non-recoverable SDK issues.&lt;br /&gt;
* '''DEBUG''': Debug logs, used by the developers to debug more complex issues.&lt;br /&gt;
&lt;br /&gt;
Once the flag is active, it logs each API call made and the data passed. The log created by this flag is minimal.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': DO NOT activate the Debug flag in a production environment.&amp;lt;/blockquote&amp;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;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createNielsenApi(delegate: NielsenAppApiDelegate) -&amp;gt; NielsenAppApi?{&lt;br /&gt;
        &lt;br /&gt;
        let appInformation:[String: String] = [&lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&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;
        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;
Sample code using AVPlayer.&lt;br /&gt;
&amp;lt;code&amp;gt;LandingVC.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;
import UIKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class LandingVC: UIViewController, NielsenAppApiDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenMain : NielsenAppApi!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenAppApiDelegate, AVPlayerViewControllerDelegate  {&lt;br /&gt;
&lt;br /&gt;
// your code//    &lt;br /&gt;
&lt;br /&gt;
  override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        //Getting the instance of NielsenApi&lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
            }&lt;br /&gt;
  }&lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {      &lt;br /&gt;
        self.data = sdkMethods.loadStaticMaster()     // This is just an example of populating the metadata&lt;br /&gt;
        self.nielsenMain.loadMetadata(self.data)&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;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;
+ (NielsenAppApi *)createNielsenAppApiWithDelegate:(id&amp;lt;NielsenAppApiDelegate&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;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;
    return [[NielsenAppApi alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&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;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 NielsenAppApi;&lt;br /&gt;
@protocol NielsenAppApiDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : 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;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;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;
    //Getting the instance of Nielsen SDK&lt;br /&gt;
    nielsenApi = [NielsenInit createNielsenAppApiWithDelegate:nil];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== API Call sequence ====&lt;br /&gt;
Call [[loadMetadata]] with JSON metadata as below.&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;
 class SDKMethods : NSObject{ &lt;br /&gt;
    func loadStaticMaster() -&amp;gt; [String : Any] {      &lt;br /&gt;
        //Loading Static Main data      &lt;br /&gt;
        let staticData =&lt;br /&gt;
            [&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
        &amp;quot;assetid&amp;quot;: &amp;quot;C77664&amp;quot;,     //optional for static measurement&lt;br /&gt;
        &amp;quot;section&amp;quot;: &amp;quot;siteSection&amp;quot;,&lt;br /&gt;
        &amp;quot;segA&amp;quot;: &amp;quot;segmentA&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;, //optional&lt;br /&gt;
        &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;, //optional&lt;br /&gt;
        ]       &lt;br /&gt;
        return staticData    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;     &lt;br /&gt;
|Objective C = &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
NSDictionary * staticMetadata = @ {&lt;br /&gt;
    @ &amp;quot;type&amp;quot;: @ &amp;quot;static&amp;quot;,&lt;br /&gt;
        @ &amp;quot;assetid&amp;quot;: @ &amp;quot;C77664&amp;quot;,  //optional for static measurement&lt;br /&gt;
        @ &amp;quot;section&amp;quot;: @ &amp;quot;siteSection&amp;quot;,&lt;br /&gt;
        @ &amp;quot;segA&amp;quot;: @ &amp;quot;Segment A&amp;quot;,&lt;br /&gt;
        @ &amp;quot;segB&amp;quot;: @ &amp;quot;CustomSegmentValueB&amp;quot;, //optional&lt;br /&gt;
        @ &amp;quot;segC&amp;quot;: @ &amp;quot;CustomSegmentValueC&amp;quot;, //optional&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[File:Sdk_dataflow.jpg|link=]]&lt;br /&gt;
&lt;br /&gt;
=== Configure Metadata ===&lt;br /&gt;
Map the Nielsen keys to variables so that the content metadata is dynamically updated.&lt;br /&gt;
&lt;br /&gt;
The Nielsen reserved keys are:&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 &amp;lt;br&amp;gt;(no [[Special Characters]]) || No&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;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&lt;br /&gt;
'''Aggregation Limits'''&lt;br /&gt;
There are limits on the number of unique values that can be aggregated on in reporting. The specific limitations by key are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Aggregation Limit&lt;br /&gt;
|-&lt;br /&gt;
| section || maximum of 25 unique values (section &amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segA || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segB || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segC || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DCR Static Duration Measurement per Section/Page/Asset ===&lt;br /&gt;
If your Nielsen AppID is enabled for DCR Static duration measurement, a view event will be recorded and a timer will be started for each screen/page. Duration will be measured until a new page is loaded or the app is moved to the background. The event which triggers recognition of page view and timer start is the loadMetadata API call with a metadata object of type 'static'. Once a page is viewed and the timer has started, duration will be measured until a new page has loaded ''with associated loadMetadata call having a different '''section name''' from the previous page''. If a new loadMetadata call is made with the same '''section name''', it will be ignored - no new view will be recorded. If it is desired to have a new view event even though the metadata contains the same '''section name''' (example: single-page apps having several assedIDs but common section name), staticEnd API can be called between page views. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionDiag&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show flow diagram for above description &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionDiag&amp;quot;&amp;gt; &lt;br /&gt;
[[File:DCRstaticflow.png|500px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example 1''' - In this example, a static view and duration ping with duration=25 will be generated for &amp;quot;SPORTS&amp;quot; section.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionSW1&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show Swift Example &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionSW1&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
  let staticMetadataSports = [ &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;, &amp;quot;section&amp;quot;: &amp;quot;SPORTS&amp;quot; ]&lt;br /&gt;
  nielsenSDK.loadMetadata(staticMetadataSports)          &lt;br /&gt;
  //in this example, after 25 seconds, new metadata is loaded for section &amp;quot;MOVIES&amp;quot;          &lt;br /&gt;
&lt;br /&gt;
  let staticMetadataMovies = [ &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;, &amp;quot;section&amp;quot;: &amp;quot;MOVIES&amp;quot; ]&lt;br /&gt;
  nielsenSDK.loadMetadata(staticMetadataMovies)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionOC1&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show Objective-C Example &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionOC1&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
 NSDictionary *staticMetadataSports = @{@&amp;quot;type&amp;quot;: @&amp;quot;static&amp;quot;, @&amp;quot;section&amp;quot;: @&amp;quot;SPORTS&amp;quot;};&lt;br /&gt;
 [self.nielsenSDK loadMetadata:staticMetadataSports];&lt;br /&gt;
&lt;br /&gt;
  //in this example, after 25 seconds, new metadata is loaded for section &amp;quot;MOVIES&amp;quot;          &lt;br /&gt;
&lt;br /&gt;
 NSDictionary *staticMetadataMovies = @{@&amp;quot;type&amp;quot;: @&amp;quot;static&amp;quot;, @&amp;quot;section&amp;quot;: @&amp;quot;MOVIES&amp;quot;};&lt;br /&gt;
 [self.nielsenSDK loadMetadata:staticMetadataMovies];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Example 2''' - In this example,, let's assume 20 seconds after the page is viewed, the app goes to background. A static duration ping with duration=20 will be generated for &amp;quot;SPORTS&amp;quot; section.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionSW2&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show Swift Example &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionSW2&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
  let staticMetadataSports = [ &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;, &amp;quot;section&amp;quot;: &amp;quot;SPORTS&amp;quot; ]&lt;br /&gt;
  nielsenSDK.loadMetadata(staticMetadataSports)          &lt;br /&gt;
  //App goes to background or killed after 20 seconds.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionOC2&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show Objective-C Example &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionOC2&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
  NSDictionary *staticMetadataSports = @{@&amp;quot;type&amp;quot;: @&amp;quot;static&amp;quot;, @&amp;quot;section&amp;quot;: @&amp;quot;SPORTS&amp;quot;};&lt;br /&gt;
 [self.nielsenSDK loadMetadata:staticMetadataSports];         &lt;br /&gt;
  //App goes to background or killed after 20 seconds.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Note:''' Once the app is returned to foreground or relaunched, the app needs to pass static metadata again in order to restart measuring DCR Static duration.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Example 3''' - Here we wish to generate a new view event and start a new duration timer even though the section name in the metadata is the same.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionSW3&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show Swift Example &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionSW3&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
let staticMetadataSports = [ &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;, &amp;quot;section&amp;quot;: &amp;quot;SPORTS&amp;quot;, &amp;quot;assetid&amp;quot;: &amp;quot;TENNIS&amp;quot;]&lt;br /&gt;
nielsenSDK.loadMetadata(staticMetadataSports) &lt;br /&gt;
//in this example, after 25 seconds, we pass staticEnd before new metadata is loaded for section &amp;quot;SPORTS&amp;quot;, but assetid &amp;quot;CRICKET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nielsenSDK.staticEnd()&lt;br /&gt;
&lt;br /&gt;
let staticMetadataSports = [ &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;, &amp;quot;section&amp;quot;: &amp;quot;SPORTS&amp;quot;, &amp;quot;assetid&amp;quot;: &amp;quot;CRICKET&amp;quot;]&lt;br /&gt;
nielsenSDK.loadMetadata(staticMetadataSports)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionOC3&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show Objective-C Example &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionOC3&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Objective-C&amp;quot;&amp;gt;&lt;br /&gt;
NSDictionary *staticMetadataSports = @{@&amp;quot;type&amp;quot;: @&amp;quot;static&amp;quot;, @&amp;quot;section&amp;quot;: @&amp;quot;SPORTS&amp;quot;, @&amp;quot;assetid&amp;quot;: @&amp;quot;TENNIS&amp;quot;};&lt;br /&gt;
 [self.nielsenSDK loadMetadata:staticMetadataSports]; &lt;br /&gt;
//in this example, after 25 seconds, we pass staticEnd before new metadata is loaded for section &amp;quot;SPORTS&amp;quot;, but assetid &amp;quot;CRICKET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[self.nielsenSDK staticEnd];&lt;br /&gt;
&lt;br /&gt;
NSDictionary *staticMetadataSports = @{@&amp;quot;type&amp;quot;: @&amp;quot;static&amp;quot;, @&amp;quot;section&amp;quot;: @&amp;quot;SPORTS&amp;quot;, @&amp;quot;assetid&amp;quot;: @&amp;quot;CRICKET&amp;quot;};&lt;br /&gt;
 [self.nielsenSDK loadMetadata:staticMetadataSports]; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Note:''' Even though the assetid has changed, a new view event would not be recognized unless staticEnd() is called in between loadMetadata calls, because the section name did not change.&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;
{{Template:iOS_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Pre-Certification Checklists ==&lt;br /&gt;
After the application is ready to be sent for Nielsen Certification, please go through the [[DCR_Pre-Certification_Checklist|Pre-Certification Checklist]] and ensure the app behaves as expected, before submitting to Nielsen.&lt;br /&gt;
&lt;br /&gt;
== Testing an Implementation - App ==&lt;br /&gt;
See [[Digital Measurement Testing]].&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;
&amp;lt;br/&amp;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>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=iOS_Step_By_Step&amp;diff=6588</id>
		<title>iOS Step By Step</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=iOS_Step_By_Step&amp;diff=6588"/>
		<updated>2024-03-27T02:50:02Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
Provided below are step-by-step quick start guides for implementing Nielsen iOS SDK for DCR Static, DCR Video, and DTVR products. Click each section to get started. &lt;br /&gt;
&lt;br /&gt;
== &amp;amp;rarr; iOS DCR Static ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide DCR Static &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== iOS DCR Static Introduction ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisiona-&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide Intro &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisiona-&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Digital Content Ratings (DCR) Static product provides content consumption measurement in client mobile apps and webpages. This measurement includes insight into the total time a user spent on a webpage, how they navigated through the page via links, and many other data points.&lt;br /&gt;
This tutorial provides the steps to implement the DCR Static product in a sample iOS app. It includes:&lt;br /&gt;
&lt;br /&gt;
*SDK Initialization Call&lt;br /&gt;
*DCR Static Metadata: information about the sections being tracked&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you will have the needed steps to integrate Nielsen's AppSDK in the background of your app.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== iOS DCR Static Step 1 - Obtain AppID ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisiona1&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 1 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisiona1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To begin using the iOS SDK (AppSDK) you will need to obtain an Application ID (AppId)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! Item !! Description !! Source&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;#9989; || App ID (appid) || Unique ID assigned to the player/site and configured by product || Contact your Nielsen TAM&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the AppSDK in the app.&lt;br /&gt;
&amp;lt;/br&amp;gt;Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== iOS DCR Static Step 2 - SDK Initialization ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionc&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 2 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionc&amp;quot;&amp;gt;&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 CocoaPods. We recommend using the CocoaPods-based integration whenever possible to ensure you maintain the most recent changes and enhancements to the Nielsen libraries.&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain CocoaPods implementation guide]]&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&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, when using the dynamic framework,  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. (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
==== Add Framework ====&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.  (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
==== Add Path ====&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.  (''Not required if using CocaPods'')&lt;br /&gt;
&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;
Add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Using Objective-C ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
@import NielsenAppApi;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createNielsenApi(delegate: NielsenAppApiDelegate) -&amp;gt; NielsenAppApi?{&lt;br /&gt;
        &lt;br /&gt;
        let appInformation:[String: String] = [&lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&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;
        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;
Sample code using AVPlayer.&lt;br /&gt;
&amp;lt;code&amp;gt;LandingVC.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;
import UIKit&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class LandingVC: UIViewController, NielsenAppApiDelegate {&lt;br /&gt;
    &lt;br /&gt;
    var nielsenMain : NielsenAppApi!&lt;br /&gt;
    var sdkMethods : SDKMethods!&lt;br /&gt;
    var data : [String : Any]!&lt;br /&gt;
&lt;br /&gt;
class ViewController: UIViewController, NielsenAppApiDelegate, AVPlayerViewControllerDelegate  {&lt;br /&gt;
&lt;br /&gt;
// your code//    &lt;br /&gt;
&lt;br /&gt;
  override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        //Getting the instance of NielsenApi&lt;br /&gt;
        self.nielsenApi = NielsenInit.createNielsenApi(delegate: self)&lt;br /&gt;
            }&lt;br /&gt;
  }&lt;br /&gt;
    override func viewDidAppear(_ animated: Bool) {      &lt;br /&gt;
        self.data = sdkMethods.loadStaticMaster()     // This is just an example of populating the metadata&lt;br /&gt;
        self.nielsenMain.loadMetadata(self.data)&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;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;
+ (NielsenAppApi *)createNielsenAppApiWithDelegate:(id&amp;lt;NielsenAppApiDelegate&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;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;
    return [[NielsenAppApi alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&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;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 NielsenAppApi;&lt;br /&gt;
@protocol NielsenAppApiDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : 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;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;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;
    //Getting the instance of Nielsen SDK&lt;br /&gt;
    nielsenApi = [NielsenInit createNielsenAppApiWithDelegate:nil];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== iOS DCR Static Step 3 - Create/Load DCR Static Metadata Object ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisiond&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 3 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisiond&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configure Metadata ====&lt;br /&gt;
Map the Nielsen keys to variables so that the content metadata is dynamically updated.&lt;br /&gt;
&lt;br /&gt;
The Nielsen reserved keys are:&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 &amp;lt;br&amp;gt;(no [[Special Characters]]) || No&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;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Configure API calls - loadMetadata ====&lt;br /&gt;
Use [[loadMetadata]] to pass 'content' [[Digital Measurement Metadata]]. The CMS data must be passed as a JSON object.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;    loadMetadata(JSONObject jsonMetadata);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: The [[loadMetadata]] call must have (&amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;). &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Call [[loadMetadata]] with JSON metadata as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;    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;siteSection&amp;quot;)&lt;br /&gt;
        .put(&amp;quot;assetid&amp;quot;, &amp;quot;vid345-67483&amp;quot;)&lt;br /&gt;
        .put(&amp;quot;segA&amp;quot;, &amp;quot;segmentA&amp;quot;)&lt;br /&gt;
        .put(&amp;quot;segB&amp;quot;, &amp;quot;segmentB&amp;quot;)&lt;br /&gt;
        .put(&amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As soon as this loadMetadata call is made, AppSDK will record a view event and start tracking the section/page time spent (AppSDK 9.1 and above).&lt;br /&gt;
&lt;br /&gt;
==== DCR Static Duration Measurement per Section/Page/Asset ====&lt;br /&gt;
If your Nielsen AppID is enabled for DCR Static duration measurement, a view event will be recorded and a timer will be started for each screen/page. Duration will be measured until a new page is loaded or the app is moved to the background. The event which triggers recognition of page view and timer start is the loadMetadata API call with a metadata object of type 'static'. Once a page is viewed and the timer has started, duration will be measured until a new page has loaded ''with associated loadMetadata call having a different '''section name''' from the previous page''. If a new loadMetadata call is made with the same '''section name''', it will be ignored - no new view will be recorded. If it is desired to have a new view event even though the metadata contains the same '''section name''' (example: single-page apps having several assedIDs but common section name), staticEnd API can be called between page views. For the purposes of this overview, staticend will not be used. See [[DCR_Static_iOS_SDK|this page]] for more information. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Keep Going ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisiong&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisiong&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Congratulations, you've successfully integrated the iOS SDK in your app!&lt;br /&gt;
&lt;br /&gt;
You can add static loadMetadata calls for more sections/pages in your app to see what happens when transitioning between sections.&lt;br /&gt;
&lt;br /&gt;
View your application's debug logs and search for the term (AppSDK) to see messages emitted by Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Next Steps ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisioni&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisioni&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that you've integrated DCR Static for the AppSDK, what's next?&lt;br /&gt;
&lt;br /&gt;
====Going Live====&lt;br /&gt;
&lt;br /&gt;
In addition to the basic steps above, before going live developers need to handle app background/foreground events, make certain privacy disclosures, and allow users to opt out of Nielsen measurement. More details can be found [[DCR_Static_iOS_SDK|here]], along with a more comprehensive reference for implementing DCR Static measurement with AppSDK.&lt;br /&gt;
&lt;br /&gt;
Once the DCR Tracking Code is added, Nielsen will validate the implementation. Following Nielsen testing, developers need to make a few updates to the initialization call to ensure that the app is being measured properly.&lt;br /&gt;
&lt;br /&gt;
#'''App ID''': Ensure that correct  is used during initialization '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'''&lt;br /&gt;
#'''Debug Logging''': Disable logging by changing initialization call to use @&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;INFO&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;amp;rarr; iOS DCR Video ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision1&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide DCR Video &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision1&amp;quot;&amp;gt;&lt;br /&gt;
==== iOS DCR Video Introduction ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv2-&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide Intro &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv2-&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Digital Content Ratings (DCR) Video product provides content consumption measurement in client mobile apps and webpages. This measurement includes insight into the total time a user spent watching the tracked content, video player events, and much more.&lt;br /&gt;
This example provides the steps to implement the DCR Video product in a sample iOS app. It includes:&lt;br /&gt;
&lt;br /&gt;
*SDK Initialization&lt;br /&gt;
*DCR Video Metadata: information about the content being tracked&lt;br /&gt;
*DCR Video Events/API calls&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you will have the needed steps to integrate Nielsen's AppSDK in the background of your app.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== iOS DCR Video Step 1 - Obtain AppID ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv3&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 1 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To begin using the iOS AppSDK, you will need to obtain an Application ID (AppId)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! Item !! Description !! Source&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;#9989; || App ID (appid) || Unique ID assigned to the player/site and configured by product || Contact your Nielsen Representative&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the AppSDK in the app.&lt;br /&gt;
&amp;lt;/br&amp;gt;Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== iOS DCR Video Step 2 - SDK Initialization ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionc&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 2 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionc&amp;quot;&amp;gt;&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 CocoaPods. We recommend using the CocoaPods-based integration whenever possible to ensure you maintain the most recent changes and enhancements to the Nielsen libraries.&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain CocoaPods implementation guide]]&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&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, when using the dynamic framework,  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. (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
======= Add Framework =======&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.  (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
======= Add Path =======&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.  (''Not required if using CocaPods'')&lt;br /&gt;
&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;
Add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======= Using Objective-C =======&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
@import NielsenAppApi;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======= SDK Initialization =======&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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|--style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
| appid || Unique Nielsen ID for the application. The ID is a GUID data type. If you did not receive your App ID, let us know and we will provide you. || Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|--style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
| nol_devDebug || Enables Nielsen console logging. Only required for testing &amp;lt;br&amp;gt;&lt;br /&gt;
|| Nielsen-specified || Optional || DEBUG&lt;br /&gt;
|}&lt;br /&gt;
==== Debug flag for development environment ====&lt;br /&gt;
Player application developers / integrators can use Debug flag to check whether an App SDK API call made is successful. To activate the Debug flag,&lt;br /&gt;
Pass the argument &amp;lt;code&amp;gt;@&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;DEBUG&amp;quot;&amp;lt;/code&amp;gt;, in the JSON string . &lt;br /&gt;
&lt;br /&gt;
Once the flag is active, it logs each API call made and the data passed. The log created by this flag is minimal.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': DO NOT activate the Debug flag in a production environment.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Example ===&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&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;PE392366B-F2C1-4BC4-AB62-A7DAFDCXXXX&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&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;
        self.nielsenAppApi = NielsenInit.createNielsenAppApi(delegate: self)&lt;br /&gt;
        NSLog(&amp;quot;Nielsen SDK initialized&amp;quot;)&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Objective C ===&lt;br /&gt;
==== Sample SDK Initialization Code ====&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;
+ (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;PE392366B-F2C1-4BC4-AB62-A7DAFDC51XXX&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;
@interface NlsAppApiFactory : NSObject&lt;br /&gt;
+ (NielsenAppAPI *) createNielsenAppApiWithDelegate:(id&amp;lt;NielsenAppApiDelegate&amp;gt;)delegate;&lt;br /&gt;
@end&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The following might be in the &amp;lt;code&amp;gt;Viewcontroller.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;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;
    //Setting background image&lt;br /&gt;
    UIImage *backgroundImage = [UIImage imageNamed:@&amp;quot;new_ios_bg.png&amp;quot;];&lt;br /&gt;
    UIImageView *backgroundImageView=[[UIImageView alloc]initWithFrame:self.view.frame];&lt;br /&gt;
    backgroundImageView.image=backgroundImage;&lt;br /&gt;
    [self.view insertSubview:backgroundImageView atIndex:0];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the Nielsen SDK.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of Nielsen SDK&lt;br /&gt;
    nielsenApi = [NielsenInit createNielsenAppApiWithDelegate:nil];&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;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== iOS DCR Video Step 3 - Create DCR Video Content Metadata Object ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv5&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 3 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv5&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Configure Metadata =====&lt;br /&gt;
The SDK methods handle 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 Nielsen Key names (e.g. appid, program) 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;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== Create channelName 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;
|--style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
! Key !! Description !!	Values	 !! Required&lt;br /&gt;
|--style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
| channelName	|| Any string representing the channel/stream	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Create Content Metadata =====&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.&lt;br /&gt;
&amp;lt;blockquote&amp;gt; program and title metadata values should be passed to SDK as UTF-8 strings. &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;height: 45em; overflow-y:auto;&amp;quot;&amp;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'''!!'''Provider'''&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset ||For Video use: &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; For Static or text &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt; || Yes || Nielsen&lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| assetid || Unique ID assigned to asset &amp;lt;br&amp;gt; Note: Refrain from using the following special characters [[Special_Characters|(Special Characters)]]. || Examples: &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;BBT345a234 &amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;CBSs5e234F2021&amp;lt;/code&amp;gt;  || Yes || Client &lt;br /&gt;
|-&lt;br /&gt;
| program ||Complete program or movie title &amp;lt;br&amp;gt; (no abbreviations or shorthand) &amp;lt;br&amp;gt; Note: there is a 25 character limit.  ||&amp;lt;code&amp;gt; The Big Bang Theory&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt; TheBigBangTheory&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&amp;lt;code&amp;gt; The Dark Knight&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&amp;lt;code&amp;gt; TheDarkKnight&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; || Yes || Client &lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| title ||Episode title with season and episode number (40 character limit) &amp;lt;br&amp;gt; (Formats accepted: S01E03, S1E3, S1 E3). || Examples: &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;The Pants Alternative S03E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;The Pants Alternative S3E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;The Pants Alternative S3 E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; Can also accept: &amp;lt;code&amp;gt; S3E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; Not Valid: &amp;lt;code&amp;gt; 318 &amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt; 0318 &amp;lt;/code&amp;gt;|| Yes || Client &lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Gracenote TMS ID (If available) should be passed for all telecasted content for clients using the Gracenote solution for proper matching purposes. &amp;lt;br&amp;gt;Note: The TMS ID will be a 14 character string. Normally leading with 2 alpha characters ('EP', 'MV', 'SH' or 'SP'), followed by 12 numbers.&lt;br /&gt;
|| The TMS ID will be a 14 character string. &amp;lt;br&amp;gt; Normally being with  'EV,' 'EP', 'SH', 'SP', or 'MV' &amp;lt;br&amp;gt; Followed by 12 numbers after the initial two letter prefix. &amp;lt;br&amp;gt; &amp;lt;br&amp;gt; The Giant Morning Show: &amp;lt;code&amp;gt;SH009311820022&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; The Pants Alternative Episode : &amp;lt;code&amp;gt;EP009311820061&amp;lt;/code&amp;gt; || Optional || Nielsen&lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| crossId2 || Populated by content distributor to contribute viewing from that distributor to the given content originator. || For a full list of acceptable values, please contact your Nielsen reprentative. || Yes, for distributors || Nielsen&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds&amp;lt;br&amp;gt;Note: Integers and decimals are acceptable values are acceptable for the length parameter. || Examples:&lt;br /&gt;
&amp;lt;small&amp;gt;For standard VOD content - &amp;lt;code&amp;gt;300&amp;lt;/code&amp;gt; to represent 5 minutes, &amp;lt;code&amp;gt;1320&amp;lt;/code&amp;gt; to represent 22 minutes, etc.&lt;br /&gt;
&amp;lt;br&amp;gt;If DAI live stream of a discrete program (Live Event/Sporting Event), pass length of content. See example for standard VOD content above.&lt;br /&gt;
&amp;lt;br&amp;gt;If unknown DAI live steam, pass a value of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/small&amp;gt; &lt;br /&gt;
|| Yes || Client &lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| airdate ||Original broadcast or release date for the program &amp;lt;br&amp;gt;For USA, date should be EST &amp;lt;br&amp;gt; Outside USA, date should be local time.&amp;lt;br&amp;gt;If not applicable or available, original broadcast or release date for the Program. || Acceptable Formats:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDTHH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDHH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDTHH:MI:SS+xx:xx&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDTHH:MI:SS-xx:xx&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYYMMDDHH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYYMMDD HH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;MM-DD-YYYY&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;MM/DD/YYYY&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYYMMDD&amp;lt;/code&amp;gt;&amp;lt;/big&amp;gt; || Yes || Client &lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag to identify differences between long form content. || &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;- non full episode(clip,teaser,promo,etc.)&lt;br /&gt;
&amp;lt;small&amp;gt;Also accept: &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;lf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;- longform&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;- shortform&lt;br /&gt;
|| Yes || Nielsen&lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| adloadtype || &amp;lt;big&amp;gt;&amp;lt;small&amp;gt;Type of ad load: &lt;br /&gt;
&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; Linear – matches TV ad load&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; Dynamic – Dynamic Ad Insertion (DAI)&amp;lt;/small&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
|| &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - DCR measures content with dynamic ads || Yes || Nielsen&lt;br /&gt;
|-&lt;br /&gt;
| segB || One of two custom segment for the clients granular reporting within a brand. || Examples:&amp;lt;br&amp;gt;Genre - &amp;lt;code&amp;gt;horror&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comedy&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;Timeslot - &amp;lt;code&amp;gt;primetime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;daytime&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;News type - &amp;lt;code&amp;gt;breakingnews&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;weather&amp;lt;/code&amp;gt;, etc. || Optional || Client &lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| segC || One of two custom segment for the clients granular reporting within a brand. || Examples:&amp;lt;br&amp;gt;Genre - &amp;lt;code&amp;gt;horror&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comedy&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;Timeslot - &amp;lt;code&amp;gt;primetime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;daytime&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;News type - &amp;lt;code&amp;gt;breakingnews&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;weather&amp;lt;/code&amp;gt;, etc. || Optional || Client &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&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.&lt;br /&gt;
&lt;br /&gt;
Examples regarding usage of segments within SDK:&lt;br /&gt;
* All comedy clips and stories for a Brand rolled into a &amp;quot;Comedy&amp;quot; segment&lt;br /&gt;
* genre grouping content by Comedy vs. Drama&lt;br /&gt;
* group related Text + Video content - i.e. for a show that has a lot of - static pages associated with it&lt;br /&gt;
* packaging based on how clients sell inventory&lt;br /&gt;
* grouping related types of content either by genre, category or platform.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Metadata Example =====&lt;br /&gt;
&amp;lt;code&amp;gt;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;
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;C77664&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;: &amp;quot;The Big Bang Theory&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;The Pants Alternative S03E18&amp;quot;,  //Formats accepted: S01E03, S1E3, S1 E3&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;: &amp;quot;EP009311820061&amp;quot;, //optional&lt;br /&gt;
    &amp;quot;crossId2&amp;quot;: &amp;quot;Content Originator&amp;quot;, //optional&lt;br /&gt;
    &amp;quot;length&amp;quot;: &amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;: &amp;quot;2022-03-21T10:05:00&amp;quot;, &lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;: &amp;quot;Yes&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;, //optional&lt;br /&gt;
    &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot; //optional&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;
&amp;lt;code&amp;gt;Objective-C&amp;lt;/code&amp;gt;    &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt; &lt;br /&gt;
NSDictionary * contentMetadata = @ {&lt;br /&gt;
    @ &amp;quot;type&amp;quot;: @ &amp;quot;content&amp;quot;,&lt;br /&gt;
    @ &amp;quot;assetid&amp;quot;: @ &amp;quot;C77664&amp;quot;,&lt;br /&gt;
    @ &amp;quot;program&amp;quot;: @ &amp;quot;The Big Bang Theory&amp;quot;,&lt;br /&gt;
    @ &amp;quot;title&amp;quot;: @ &amp;quot;The Pants Alternative S03E18&amp;quot;, //Formats accepted: S01E03, S1E3, S1 E3&lt;br /&gt;
    @ &amp;quot;crossId1&amp;quot;: @ &amp;quot;EP009311820061&amp;quot;, //optional&lt;br /&gt;
    @ &amp;quot;crossId2&amp;quot;: @ &amp;quot;Content Originator&amp;quot;, //optional&lt;br /&gt;
    @ &amp;quot;length&amp;quot;: @ &amp;quot;3600&amp;quot;,&lt;br /&gt;
    @ &amp;quot;airdate&amp;quot;: @ &amp;quot;2022-03-21T10:05: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;segB&amp;quot;: @ &amp;quot;CustomSegmentValueB&amp;quot;, //optional&lt;br /&gt;
    @ &amp;quot;segC&amp;quot;: @ &amp;quot;CustomSegmentValueC&amp;quot; //optional&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== iOS DCR Video Step 4 - Basic Set of Events - Sample Playback ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv6&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 4 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv6&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Events ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'play'	|| 	|| Call at start of each new stream&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
| 'playheadPosition'	|| playhead position as integer&amp;lt;br/&amp;gt;&lt;br /&gt;
VOD: current position in seconds &amp;lt;br/&amp;gt;&lt;br /&gt;
Live: current UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;lt;br/&amp;gt;&lt;br /&gt;
Note: 'PlayheadPosition' has to be called every second&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' ||	playhead position	|| Call during any interruption to content or Ad playback and at the end of each Ad.&lt;br /&gt;
|-&lt;br /&gt;
| 'end'	|| playhead position in seconds	|| Call when the current video asset completes playback and pass the playhead position. &amp;lt;br/&amp;gt;&lt;br /&gt;
Example: At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: For livestream, send the UNIX timestamp, for VOD send the time in seconds as integer. The final playhead position must be sent for the current asset being played before calling &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; or&amp;lt;code&amp;gt; '''loadmetadata'''&amp;lt;/code&amp;gt;,.&amp;lt;/blockquote&amp;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 '''Idle 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 an event to occur.&lt;br /&gt;
# '''Processing state''' – The SDK instance is processing playing information. The &amp;lt;code&amp;gt;'''play'''&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; 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;
## &amp;lt;code&amp;gt;'''playheadPosition'''&amp;lt;/code&amp;gt; – Call this API every one second when playhead position is active.  If a LIVE event, use the current UNIX timestamp (seconds since Jan-1-1970 UTC).&lt;br /&gt;
## &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt; – Call this API when the content or Ad playback is interrupted and at the end of each Ad. &lt;br /&gt;
## &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; – Call when content completes. When called, the SDK instance exits from Processing state.&lt;br /&gt;
# '''Disabled state''' – The SDK instance is disabled and is not processing playing information. &lt;br /&gt;
## &amp;lt;code&amp;gt;'''appDisableApi'''&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&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 &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; and   &amp;lt;code&amp;gt;'''playheadPosition'''&amp;lt;/code&amp;gt; &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API Call Sequence ===&lt;br /&gt;
==== Sample Use Case: Content has no Advertisements ====&lt;br /&gt;
Call [[play()]] at start of stream&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;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 [[playheadPosition|playheadPosition()]] 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(); &amp;lt;/code&amp;gt; || // Call at start of each new stream&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;
|-style=&amp;quot;background-color:#d8f5d7;&amp;quot;&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;
| Interruption || &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // call stop when content playback is interrupted&lt;br /&gt;
|-style=&amp;quot;background-color:#d8f5d7;&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Resume Content || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt;  || // Call loadMetadata and pass content metadata object when content resumes&lt;br /&gt;
|- style=&amp;quot;background-color:#d8f5d7;&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // continue pasing playhead position every second starting from position where content is resumed&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keep Going ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv9&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv9&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Congratulations, you've successfully integrated the iOS SDK in your app for a basic content playback scenario!&lt;br /&gt;
&lt;br /&gt;
You can add more content to see channel-change scenarios or continue to next steps below.&lt;br /&gt;
&lt;br /&gt;
View your application's debug logs and search for the term (AppSDK) to see messages emitted by Nielsen AppSDK during video playback.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Next Steps ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv10&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv10&amp;quot;&amp;gt;&lt;br /&gt;
====Going Live====&lt;br /&gt;
&lt;br /&gt;
In addition to the basic steps above, before going live developers need to handle app background/foreground events, make certain privacy disclosures, handle interruption events (stop, fast-forward, rewind), remove iOS simulator slices, and allow users to opt out of Nielsen measurement. More details can be found [[DCR_Video_iOS_SDK|here]], along with a more comprehensive reference for implementing DCR Video measurement with AppSDK.&lt;br /&gt;
&lt;br /&gt;
Once the DCR Tracking Code is added, Nielsen will validate the implementation. Following Nielsen testing, developers need to make a few updates to the initialization call to ensure that the app is being measured properly.&lt;br /&gt;
&lt;br /&gt;
#'''App ID''': Ensure that correct  is used during initialization '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'''&lt;br /&gt;
#'''Debug Logging''': Disable logging by changing initialization call to use @&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;INFO&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;amp;rarr; iOS DTVR ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision100&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide iOS DTVR &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision100&amp;quot;&amp;gt;&lt;br /&gt;
==== iOS DTVR Introduction ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv200-&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide Intro &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv200-&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen DTVR (Digital TV Ratings) product provides content consumption measurement in client mobile apps and webpages. This measurement includes insight into the total time a user spent watching the tracked content, video player events, and much more.&lt;br /&gt;
This example provides the steps to implement the DTVR product in a sample iOS app using Nielsen AppSDK. It includes:&lt;br /&gt;
&lt;br /&gt;
*'''SDK Initialization'''&lt;br /&gt;
*'''DTVR Video Metadata''': information about the content being tracked&lt;br /&gt;
*'''DTVR Video Events/API calls'''&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you will have the needed steps to integrate Nielsen's AppSDK in the background of your app for DTVR measurement.&lt;br /&gt;
&lt;br /&gt;
'''NOTE: video streams must have Nielsen ID3 tags embedded in order to be measured using the DTVR product. See [[Retrieving_ID3_Tags]] or contact your Nielsen representative for more information.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== iOS DTVR Step 1 - Obtain AppID ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv300&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 1 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv300&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To begin using the iOS AppSDK, you will need to obtain an Application ID (AppId)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! Item !! Description !! Source&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;#9989; || App ID (appid) || Unique ID assigned to the player/site and configured by product || Contact your Nielsen Representative&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the AppSDK in the app.&lt;br /&gt;
&amp;lt;/br&amp;gt;Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== iOS DTVR Step 2 - SDK Initialization ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision400&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 2 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision400&amp;quot;&amp;gt;&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 CocoaPods. We recommend using the CocoaPods-based integration whenever possible to ensure you maintain the most recent changes and enhancements to the Nielsen libraries.&lt;br /&gt;
* [[Digital_Measurement_iOS_Artifactory_Guide|Select to obtain CocoaPods implementation guide]]&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&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, when using the dynamic framework,  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. (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
======= Add Framework =======&lt;br /&gt;
In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.  (''Not required if using CocaPods'')&lt;br /&gt;
&lt;br /&gt;
======= Add Path =======&lt;br /&gt;
Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.  (''Not required if using CocaPods'')&lt;br /&gt;
&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;
Add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======= Using Objective-C =======&lt;br /&gt;
&amp;lt;syntaxhighlight lang =&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
@import NielsenAppApi;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======= SDK Initialization =======&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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|--style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
| appid || Unique Nielsen ID for the application. The ID is a GUID data type. If you did not receive your App ID, let us know and we will provide you. || Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|--style=&amp;quot;background-color:#d0f6f8;&amp;quot;&lt;br /&gt;
| nol_devDebug || Enables Nielsen console logging. Only required for testing &amp;lt;br&amp;gt;&lt;br /&gt;
|| Nielsen-specified || Optional || DEBUG&lt;br /&gt;
|}&lt;br /&gt;
==== Debug flag for development environment ====&lt;br /&gt;
Player application developers / integrators can use Debug flag to check whether an App SDK API call made is successful. To activate the Debug flag,&lt;br /&gt;
Pass the argument &amp;lt;code&amp;gt;@&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;DEBUG&amp;quot;&amp;lt;/code&amp;gt;, in the JSON string . &lt;br /&gt;
&lt;br /&gt;
Once the flag is active, it logs each API call made and the data passed. The log created by this flag is minimal.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': DO NOT activate the Debug flag in a production environment.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Example ===&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&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;PE392366B-F2C1-4BC4-AB62-A7DAFDCXXXX&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&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;
        self.nielsenAppApi = NielsenInit.createNielsenAppApi(delegate: self)&lt;br /&gt;
        NSLog(&amp;quot;Nielsen SDK initialized&amp;quot;)&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Objective C ===&lt;br /&gt;
==== Sample SDK Initialization Code ====&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;
+ (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;PE392366B-F2C1-4BC4-AB62-A7DAFDC51XXX&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;
@interface NlsAppApiFactory : NSObject&lt;br /&gt;
+ (NielsenAppAPI *) createNielsenAppApiWithDelegate:(id&amp;lt;NielsenAppApiDelegate&amp;gt;)delegate;&lt;br /&gt;
@end&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The following might be in the &amp;lt;code&amp;gt;Viewcontroller.m&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;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;
    //Setting background image&lt;br /&gt;
    UIImage *backgroundImage = [UIImage imageNamed:@&amp;quot;new_ios_bg.png&amp;quot;];&lt;br /&gt;
    UIImageView *backgroundImageView=[[UIImageView alloc]initWithFrame:self.view.frame];&lt;br /&gt;
    backgroundImageView.image=backgroundImage;&lt;br /&gt;
    [self.view insertSubview:backgroundImageView atIndex:0];&lt;br /&gt;
    &lt;br /&gt;
    //Mark: In NielsenInit class we are initialising the Nielsen SDK.&lt;br /&gt;
    &lt;br /&gt;
    //Getting the instance of Nielsen SDK&lt;br /&gt;
    nielsenApi = [NielsenInit createNielsenAppApiWithDelegate:nil];&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;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== iOS DTVR Step 3 - Create DTVR Content Metadata Object ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv500&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 3 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv500&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Configure Metadata =====&lt;br /&gt;
Content metadata should remain constant throughout the completion of an episode or live stream.&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 of asset	|| &amp;quot;content&amp;quot;	|| &lt;br /&gt;
|-&lt;br /&gt;
| adModel	|| linear vs dynamic ad model	|| 1 = Linear  matches TV ad load for DTVR      || ✓&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
- (NSDictionary *)loadChannelInfo&lt;br /&gt;
{&lt;br /&gt;
    //Loading Channel Info.    &lt;br /&gt;
    NSString *strUrl = self.url.absoluteString;  &lt;br /&gt;
    NSDictionary *channel = @{  @&amp;quot;channelName&amp;quot; : @&amp;quot;TheGreatBigMovie&amp;quot;: strUrl };   &lt;br /&gt;
    return channel;&lt;br /&gt;
}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objectivec&amp;quot;&amp;gt;    &lt;br /&gt;
- (NSDictionary *)loadDtvr{&lt;br /&gt;
    &lt;br /&gt;
    //Loading DTVR data  &lt;br /&gt;
    NSDictionary *dtvr = @{ @&amp;quot;adModel&amp;quot;:@&amp;quot;1&amp;quot; ,  &lt;br /&gt;
                            @&amp;quot;type&amp;quot;:@&amp;quot;content&amp;quot;,};  &lt;br /&gt;
    return dtvr;&lt;br /&gt;
}&lt;br /&gt;
    &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== iOS DTVR Step 4 - Basic Set of Events - Sample Playback ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv600&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 4 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv600&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== SDK Events/APIs =====&lt;br /&gt;
&amp;lt;!--[[File:appsdkTimeline-DTVR-V2.png|icon]]--&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each asset to pass type and adModel.&lt;br /&gt;
|-&lt;br /&gt;
| 'sendID3'	|| Used to send the ID3 tag payload retrieved from the stream || Needs to be called at the beginning of playback&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Configure API calls - loadMetadata =====&lt;br /&gt;
Use &amp;lt;code&amp;gt;loadMetadata&amp;lt;/code&amp;gt; to pass the metadata object created above. &lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;[nielsenApi loadMetadata:(dtvr)];&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Swift = &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;self.nielsenAppApi?.loadMetadata(dtvr)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===== Configure API calls - sendID3 =====&lt;br /&gt;
[[sendID3]] API is a Nielsen AppSDK receiver for timed metadata events (ID3 tags) provided through iOS’s NSNotificationCenter notification system. This API filters out Nielsen-specific ID3 tags from the system and uses them to create duration data. These ID3 tags are used by Nielsen SDK for DTVR measurement, and the stream that is played must contain ID3 tags and have these tags extracted and passed to SDK using the below procedure in order for DTVR measurement to occur. &lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Objective C = &amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;[nielsenApi sendID3:extraString];&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|Swift = &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt; [nielsenApi sendID3:extraString];&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
'''Sample ID3 tags''' &lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
Refer to [[iOS SDK API Reference#Retrieving ID3 Tags|Retrieving ID3 Tags]] section to know more details.&lt;br /&gt;
&lt;br /&gt;
===== Retrieving ID3 Tags =====&lt;br /&gt;
ID3 tags have a payload of about 249 characters and start with &amp;quot;www.nielsen.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As Apple has deprecated the use of [https://developer.apple.com/documentation/avfoundation/avplayeritem/1389602-timedmetadata?language=objc timedMetadata], we now recommend using [https://developer.apple.com/documentation/avfoundation/avplayeritemmetadataoutput?language=objc AVPlayerItemMetadataOutput] for extracting ID3 tags from the iOS Native Player.&lt;br /&gt;
&lt;br /&gt;
If any other player apart from the iOS native player is used, check and ensure that the player has the capability to extract metadata such as ID3 tags.&lt;br /&gt;
&lt;br /&gt;
===== Examples of extracting ID3 tags from the iOS Native Player =====&lt;br /&gt;
{{ExampleCode|&lt;br /&gt;
|Swift = &amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt; &lt;br /&gt;
        //First, ensure your class conforms to the AVPlayerItemMetadataOutputPushDelegate protocol.&lt;br /&gt;
           class YourClass: AVPlayerItemMetadataOutputPushDelegate { &lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
------------------------------------------------------&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt; &lt;br /&gt;
       // Then create an instance of AVPlayerItemMetadataOutput and add it to the player item&lt;br /&gt;
          let metadataOutput = AVPlayerItemMetadataOutput(identifiers: nil)&lt;br /&gt;
           playerItem.add(metadataOutput)&lt;br /&gt;
 &lt;br /&gt;
       // and set the delegate and a dispatch queue&lt;br /&gt;
           metadataOutput.setDelegate(self, queue: DispatchQueue.main)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
------------------------------------------------------&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt; &lt;br /&gt;
        // After that below callback function of AVPlayerItemMetadataOutputPushDelegate &lt;br /&gt;
        // protocol will be triggered whenever ID3 tag is received from stream. &lt;br /&gt;
          func metadataOutput(_ output: AVPlayerItemMetadataOutput, didOutputTimedMetadataGroups groups: [AVTimedMetadataGroup], from track: AVPlayerItemTrack?) {&lt;br /&gt;
    for group in groups {&lt;br /&gt;
        for item in group.items {&lt;br /&gt;
            // Handle the metadata item&lt;br /&gt;
            handleTimedMetadata(metadataItem: item)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
------------------------------------------------------&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt; &lt;br /&gt;
          // Then further metadata item can be handled like below &lt;br /&gt;
          func handleTimedMetadata(metadataItem: AVMetadataItem) {&lt;br /&gt;
    guard let key = metadataItem.key as? String,&lt;br /&gt;
          let extraString = metadataItem.extraAttributes?[AVMetadataExtraAttributeInfoKey] as? String else {&lt;br /&gt;
        return&lt;br /&gt;
    }&lt;br /&gt;
    // If the extra string(tag) starts with &amp;quot;www.nielsen.com&amp;quot;, then only sending to SDK&lt;br /&gt;
    if key == &amp;quot;PRIV&amp;quot; &amp;amp;&amp;amp; extraString.hasPrefix(&amp;quot;www.nielsen.com&amp;quot;) {&lt;br /&gt;
        DispatchQueue.global(qos: .default).async {&lt;br /&gt;
            self.nielsenApi?.sendID3(extraString)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&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;
        //First, ensure your class conforms to the AVPlayerItemMetadataOutputPushDelegate protocol.&lt;br /&gt;
          @interface YourClass : NSObject &amp;lt;AVPlayerItemMetadataOutputPushDelegate&amp;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;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
        // Then create an instance of AVPlayerItemMetadataOutput and add it to the player item&lt;br /&gt;
          AVPlayerItemMetadataOutput *metadataOutput = [[AVPlayerItemMetadataOutput alloc] initWithIdentifiers:nil];&lt;br /&gt;
          [playerItem addOutput:metadataOutput];&lt;br /&gt;
&lt;br /&gt;
        // and set the delegate and a dispatch queue&lt;br /&gt;
          [metadataOutput setDelegate:self queue:dispatch_get_main_queue()];&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
------------------------------&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
        // After that below callback function of AVPlayerItemMetadataOutputPushDelegate &lt;br /&gt;
        // protocol will be triggered whenever ID3 tag is received from stream.&lt;br /&gt;
           - (void)metadataOutput:(AVPlayerItemMetadataOutput *)output didOutputTimedMetadataGroups:(NSArray&amp;lt;AVTimedMetadataGroup *&amp;gt; *)groups fromPlayerItemTrack:(AVPlayerItemTrack *)track {&lt;br /&gt;
    for (AVTimedMetadataGroup *group in groups) {&lt;br /&gt;
        for (AVMetadataItem *item in group.items) {&lt;br /&gt;
            // Handle the metadata item&lt;br /&gt;
            [self handleTimedMetadata:item];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
------------------------------&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
        // Then further metadata item can be handled like below &lt;br /&gt;
          - (void)handleTimedMetadata:(AVMetadataItem *)item {&lt;br /&gt;
    NSString *key = (NSString *)item.key;&lt;br /&gt;
    NSString *extraString = item.extraAttributes[AVMetadataExtraAttributeInfoKey];&lt;br /&gt;
    // If the key is &amp;quot;PRIV&amp;quot; and the extra string starts with &amp;quot;www.nielsen.com&amp;quot;, send it to the Nielsen API&lt;br /&gt;
    if ([key isEqualToString:@&amp;quot;PRIV&amp;quot;] &amp;amp;&amp;amp; [extraString hasPrefix:@&amp;quot;www.nielsen.com&amp;quot;]) {&lt;br /&gt;
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{&lt;br /&gt;
            [self.nielsenApi sendID3:extraString];&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;
===== 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. &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 loadMetadata and sendID3 events to occur.&lt;br /&gt;
# '''Processing state''' – The SDK instance is processing playing information. For DTVR, the &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; call moves the SDK instance into this state. In this state, the SDK instance will be able to process sendID3 calls and measure content.&lt;br /&gt;
# '''Disabled state''' – The SDK instance is disabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keep Going ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv900&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv900&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Congratulations, you've successfully integrated the iOS SDK in your app for a basic content playback scenario!&lt;br /&gt;
&lt;br /&gt;
You can add more content to see channel-change scenarios or continue to next steps below.&lt;br /&gt;
&lt;br /&gt;
View your application's debug logs and search for the term (AppSDK) to see messages emitted by Nielsen AppSDK during video playback.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Next Steps ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv1000&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv1000&amp;quot;&amp;gt;&lt;br /&gt;
====Going Live====&lt;br /&gt;
&lt;br /&gt;
In addition to the basic steps above, before going live developers need to handle app background/foreground events, make certain privacy disclosures, handle interruption events (stop, fast-forward, rewind), remove iOS simulator slices, and allow users to opt out of Nielsen measurement. More details can be found [[DTVR_iOS_SDK|here]], along with a more comprehensive reference for implementing DTVR measurement with AppSDK.&lt;br /&gt;
&lt;br /&gt;
Once the DTVR Tracking Code is added, Nielsen will validate the implementation. Following Nielsen testing, developers need to make a few updates to the initialization call to ensure that the app is being measured properly.&lt;br /&gt;
&lt;br /&gt;
#'''App ID''': Ensure that correct  is used during initialization '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'''&lt;br /&gt;
#'''Debug Logging''': Disable logging by changing initialization call to use @&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;INFO&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Android_Step_By_Step&amp;diff=6587</id>
		<title>Android Step By Step</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Android_Step_By_Step&amp;diff=6587"/>
		<updated>2024-03-27T02:49:28Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
Provided below are step-by-step quick start guides for implementing Nielsen Android SDK for DCR Static, DCR Video, and DTVR products. Click each section to get started. &lt;br /&gt;
&lt;br /&gt;
== &amp;amp;rarr; Android DCR Static ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide DCR Static &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Android DCR Static Introduction ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision1&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide Intro &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Digital Content Ratings (DCR) Static product provides content consumption measurement on client webpages. This measurement includes insight into the total time a user spent on a webpage, how they navigated through the page via links, and many other data points.&lt;br /&gt;
This tutorial provides the steps to implement the DCR Static product in a sample Android app. It includes:&lt;br /&gt;
&lt;br /&gt;
*SDK Initialization Call&lt;br /&gt;
*DCR Static Metadata: information about the sections being tracked&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you will have the needed steps to integrate Nielsen's AppSDK in the background of your app.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Android DCR Static Step 1 - Obtain AppID ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision2&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 1 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To begin using the Android SDK (AppSDK) you will need to obtain an Application ID (AppId)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! Item !! Description !! Source&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;#9989; || App ID (appid) || Unique ID assigned to the player/site and configured by product || Contact your Nielsen TAM&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the AppSDK in the app.&lt;br /&gt;
&amp;lt;/br&amp;gt;Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Android DCR Static Step 2 - SDK Initialization ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision3&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 2 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== How to obtain the NielsenAppApi ====&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated into an application through the use of Gradle. We recommend using the Gradle-based integration whenever possible to ensure you maintain the most recent changes and enhancements to the Nielsen libraries.&lt;br /&gt;
* [[Digital_Measurement_Android_Artifactory_Guide|Select to obtain Gradle implementation guide]]&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
&lt;br /&gt;
==== SDK Initialization ====&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;
{| 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 Nielsen ID for the application. The ID is a GUID data type. If you did not receive your App ID, let us know and we will provide you. || Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&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;
&lt;br /&gt;
==== Debug flag for development environment ====&lt;br /&gt;
Player application developers / integrators can use Debug flag to check whether an App SDK API call made is successful. To activate the Debug flag,&lt;br /&gt;
Pass the argument &amp;lt;code&amp;gt;@&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;INFO&amp;quot;&amp;lt;/code&amp;gt;, in the JSON string . The permitted values are:&lt;br /&gt;
&lt;br /&gt;
* '''INFO''': Displays the API calls and the input data from the application (validate player name, app ID, etc.). It can be used as certification Aid.&lt;br /&gt;
* '''WARN''': Indicates potential integration / configuration errors or SDK issues.&lt;br /&gt;
* '''ERROR''': Indicates important integration errors or non-recoverable SDK issues.&lt;br /&gt;
* '''DEBUG''': Debug logs, used by the developers to debug more complex issues.&lt;br /&gt;
&lt;br /&gt;
Once the flag is active, it logs each API call made and the data passed. The log created by this flag is minimal.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': DO NOT activate the Debug flag in a production environment.&amp;lt;/blockquote&amp;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;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;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;) 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;
* 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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Android DCR Static Step 3 - Create/Load DCR Static Metadata Object ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision4&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 3 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision4&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configure Metadata ====&lt;br /&gt;
Map the Nielsen keys to variables so that the content metadata is dynamically updated.&lt;br /&gt;
&lt;br /&gt;
The Nielsen reserved keys are:&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 &amp;lt;br&amp;gt;(no [[Special Characters]]) || No&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;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Configure API calls - loadMetadata ====&lt;br /&gt;
Use [[loadMetadata]] to pass 'content' [[Digital Measurement Metadata]]. The CMS data must be passed as a JSON object.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;    loadMetadata(JSONObject jsonMetadata);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Refer to [[Digital Measurement Metadata]] for the list of parameters to be passed in the JSON object.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: The [[loadMetadata]] call must have (&amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;). &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Call [[loadMetadata]] with JSON metadata as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;    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;siteSection&amp;quot;)&lt;br /&gt;
        .put(&amp;quot;assetid&amp;quot;, &amp;quot;vid345-67483&amp;quot;)&lt;br /&gt;
        .put(&amp;quot;segA&amp;quot;, &amp;quot;segmentA&amp;quot;)&lt;br /&gt;
        .put(&amp;quot;segB&amp;quot;, &amp;quot;segmentB&amp;quot;)&lt;br /&gt;
        .put(&amp;quot;segC&amp;quot;,&amp;quot;segmentC&amp;quot;)&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As soon as this loadMetadata call is made, AppSDK will record a view event and start tracking the section/page time spent (AppSDK 9.1 and above).&lt;br /&gt;
&lt;br /&gt;
==== DCR Static Duration Measurement per Section/Page/Asset ====&lt;br /&gt;
If your Nielsen AppID is enabled for DCR Static duration measurement, a view event will be recorded and a timer will be started for each screen/page. Duration will be measured until a new page is loaded or the app is moved to the background. The event which triggers recognition of page view and timer start is the loadMetadata API call with a metadata object of type 'static'. Once a page is viewed and the timer has started, duration will be measured until a new page has loaded ''with associated loadMetadata call having a different '''section name''' from the previous page''. If a new loadMetadata call is made with the same '''section name''', it will be ignored - no new view will be recorded. If it is desired to have a new view event even though the metadata contains the same '''section name''' (example: single-page apps having several assedIDs but common section name), staticEnd API can be called between page views. For the purposes of this overview, staticend will not be used. See [[DCR_Static_Android_SDK|this page]] for more information. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Keep Going ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision5&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision5&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Congratulations, you've successfully integrated the Android SDK in your app!&lt;br /&gt;
&lt;br /&gt;
You can add static loadMetadata calls for more sections/pages in your app to see what happens when transitioning between sections.&lt;br /&gt;
&lt;br /&gt;
View your application's debug logs and search for the term (AppSDK) to see messages emitted by Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Next Steps ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision6&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision6&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that you've integrated DCR Static for the AppSDK, what's next?&lt;br /&gt;
&lt;br /&gt;
====Going Live====&lt;br /&gt;
&lt;br /&gt;
In addition to the basic steps above, before going live developers need to handle app background/foreground events, make certain privacy disclosures, and allow users to opt out of Nielsen measurement. More details can be found [[DCR_Static_Android_SDK|here]], along with a more comprehensive reference for implementing DCR Static measurement with AppSDK.&lt;br /&gt;
&lt;br /&gt;
Once the DCR Tracking Code is added, Nielsen will validate the implementation. Following Nielsen testing, developers need to make a few updates to the initialization call to ensure that the app is being measured properly.&lt;br /&gt;
&lt;br /&gt;
#'''App ID''': Ensure that correct  is used during initialization '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'''&lt;br /&gt;
#'''Debug Logging''': Disable logging by changing initialization call to use @&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;INFO&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;amp;rarr; Android DCR Video ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision7&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide DCR Video &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision7&amp;quot;&amp;gt;&lt;br /&gt;
==== Android DCR Video Introduction ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv8&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide Intro &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv8&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Digital Content Ratings (DCR) Video product provides content consumption measurement on client webpages. This measurement includes insight into the total time a user spent watching the tracked content, video player events, and much more.&lt;br /&gt;
This example provides the steps to implement the DCR Video product in a sample Android app. It includes:&lt;br /&gt;
&lt;br /&gt;
*SDK Initialization&lt;br /&gt;
*DCR Video Metadata: information about the content being tracked&lt;br /&gt;
*DCR Video Events/API calls&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you will have the needed steps to integrate Nielsen's AppSDK in the background of your app.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Android DCR Video Step 1 - Obtain AppID ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv9&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 1 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv9&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To begin using the Android AppSDK, you will need to obtain an Application ID (AppId)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! Item !! Description !! Source&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;#9989; || App ID (appid) || Unique ID assigned to the player/site and configured by product || Contact your Nielsen Representative&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the AppSDK in the app.&lt;br /&gt;
&amp;lt;/br&amp;gt;Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Android DCR Video Step 2 - SDK Initialization ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision10&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 2 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision10&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Setting up your  Development Environment  =====&lt;br /&gt;
===== Configuring Android Development Environment =====&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;
*The Nielsen App SDK can also be added via [https://engineeringportal.nielsen.com/docs/Digital_Measurement_Android_Artifactory_Guide Artifact Repository].&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;
&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.gradle (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
&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 &amp;quot;+&amp;quot; button and search for &amp;lt;code&amp;gt;&amp;quot;*play-services*&amp;quot;&amp;lt;/code&amp;gt;.  Then select the most recent version of the play-services Artifact.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
&lt;br /&gt;
===== Google AD ID Permissions =====&lt;br /&gt;
The following is required if target API level is set to 31 (Android 12) with the Ad Version of the Nielsen SDK.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;com.google.android.gms.permission.AD_ID&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&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;&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;code&amp;gt;&amp;lt;application&amp;gt;&amp;lt;/code&amp;gt; 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;
* 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;
&lt;br /&gt;
The following table contains the list of arguments that can be passed via the AppInfo JSON schema.&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 Nielsen ID for the application. The ID is a GUID data type. If you did not receive your App ID, let us know and we will provide you. || Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&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;
== Debug flag for development environment ==&lt;br /&gt;
Player application developers / integrators can use Debug flag to check whether an App SDK API call made is successful. To activate the Debug flag,&lt;br /&gt;
Pass the argument &amp;lt;code&amp;gt;@&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;DEBUG&amp;quot;&amp;lt;/code&amp;gt;, in the JSON string . The permitted values are:&lt;br /&gt;
&lt;br /&gt;
* '''INFO''': Displays the API calls and the input data from the application (validate player name, app ID, etc.). It can be used as certification Aid.&lt;br /&gt;
* '''WARN''': Indicates potential integration / configuration errors or SDK issues.&lt;br /&gt;
* '''ERROR''': Indicates important integration errors or non-recoverable SDK issues.&lt;br /&gt;
* '''DEBUG''': Debug logs, used by the developers to debug more complex issues.&lt;br /&gt;
&lt;br /&gt;
Once the flag is active, it logs each API call made and the data passed. The log created by this flag is minimal.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': DO NOT activate the Debug flag in a production environment.&amp;lt;/blockquote&amp;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;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;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;) 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;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Android DCR Video Step 3 - Create DCR Video Content Metadata Object ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv11&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 3 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv11&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Handling JSON Metadata =====&lt;br /&gt;
The SDK methods handle 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;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;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;The Big Bang Theory&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;title&amp;quot;, &amp;quot;The Pants Alternative S03E18&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;crossId1&amp;quot;, &amp;quot;EP009311820061&amp;quot;)  //optional  &lt;br /&gt;
    .put(&amp;quot;crossId2&amp;quot;, &amp;quot;Content Originator&amp;quot;)  //optional  &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;yes&amp;quot;) &lt;br /&gt;
    .put(&amp;quot;airdate&amp;quot;, &amp;quot;2022-03-21T10:05:00&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;adloadtype&amp;quot;, &amp;quot;2&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;segB&amp;quot;, &amp;quot;CustomSegmentValueB&amp;quot;) //optional&lt;br /&gt;
    .put(&amp;quot;segC&amp;quot;, &amp;quot;CustomSegmentValueC&amp;quot;) //optional&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/syntaxhighlight&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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! '''Keys''' !! '''Description''' !! '''Values''' !! '''Required'''!!'''Provider'''&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset ||For Video use: &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; For Static or text &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt; || Yes || Nielsen&lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| assetid || Unique ID assigned to asset &amp;lt;br&amp;gt; Note: Refrain from using the following special characters [[Special_Characters|(Special Characters)]]. || Examples: &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;BBT345a234 &amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;CBSs5e234F2021&amp;lt;/code&amp;gt;  || Yes || Client &lt;br /&gt;
|-&lt;br /&gt;
| program ||Complete program or movie title &amp;lt;br&amp;gt; (no abbreviations or shorthand) &amp;lt;br&amp;gt; Note: there is a 25 character limit.  ||&amp;lt;code&amp;gt; The Big Bang Theory&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt; TheBigBangTheory&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&amp;lt;code&amp;gt; The Dark Knight&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&amp;lt;code&amp;gt; TheDarkKnight&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; || Yes || Client &lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| title ||Episode title with season and episode number (40 character limit) &amp;lt;br&amp;gt; (Formats accepted: S01E03, S1E3, S1 E3). || Examples: &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;The Pants Alternative S03E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;The Pants Alternative S3E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;The Pants Alternative S3 E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; Can also accept: &amp;lt;code&amp;gt; S3E18&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; Not Valid: &amp;lt;code&amp;gt; 318 &amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt; 0318 &amp;lt;/code&amp;gt;|| Yes || Client &lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Gracenote TMS ID (If available) should be passed for all telecasted content for clients using the Gracenote solution for proper matching purposes. &amp;lt;br&amp;gt;Note: The TMS ID will be a 14 character string. Normally leading with 2 alpha characters ('EP', 'MV', 'SH' or 'SP'), followed by 12 numbers.&lt;br /&gt;
|| The TMS ID will be a 14 character string. &amp;lt;br&amp;gt; Normally being with  'EV,' 'EP', 'SH', 'SP', or 'MV' &amp;lt;br&amp;gt; Followed by 12 numbers after the initial two letter prefix. &amp;lt;br&amp;gt; &amp;lt;br&amp;gt; The Giant Morning Show: &amp;lt;code&amp;gt;SH009311820022&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt; The Pants Alternative Episode : &amp;lt;code&amp;gt;EP009311820061&amp;lt;/code&amp;gt; || Optional || Nielsen&lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| crossId2 || Populated by content distributor to contribute viewing from that distributor to the given content originator. || Custom&amp;lt;br&amp;gt;For a full list of acceptable values, please contact your Nielsen reprentative. || Yes, for distributors || Nielsen&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds&amp;lt;br&amp;gt;Note: Integers and decimals are acceptable values are acceptable for the length parameter. || Examples:&lt;br /&gt;
&amp;lt;small&amp;gt;For standard VOD content - &amp;lt;code&amp;gt;300&amp;lt;/code&amp;gt; to represent 5 minutes, &amp;lt;code&amp;gt;1320&amp;lt;/code&amp;gt; to represent 22 minutes, etc.&lt;br /&gt;
&amp;lt;br&amp;gt;If DAI live stream of a discrete program (Live Event/Sporting Event), pass length of content. See example for standard VOD content above.&lt;br /&gt;
&amp;lt;br&amp;gt;If unknown DAI live steam, pass a value of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/small&amp;gt; &lt;br /&gt;
|| Yes || Client &lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| airdate ||Original broadcast or release date for the program &amp;lt;br&amp;gt;For USA, date should be EST &amp;lt;br&amp;gt; Outside USA, date should be local time.&amp;lt;br&amp;gt;If not applicable or available, original broadcast or release date for the Program. || Acceptable Formats:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDTHH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDHH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDTHH:MI:SS+xx:xx&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYY-MM-DDTHH:MI:SS-xx:xx&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYYMMDDHH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYYMMDD HH:MI:SS&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;MM-DD-YYYY&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;MM/DD/YYYY&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;YYYYMMDD&amp;lt;/code&amp;gt;&amp;lt;/big&amp;gt; || Yes || Client &lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag to identify differences between long form content. || &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;- non full episode(clip,teaser,promo,etc.)&lt;br /&gt;
&amp;lt;small&amp;gt;Also accept: &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;lf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;- longform&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;- shortform&lt;br /&gt;
|| Yes || Nielsen&lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| adloadtype || &amp;lt;big&amp;gt;&amp;lt;small&amp;gt;Type of ad load: &lt;br /&gt;
&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; Linear – matches TV ad load&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; Dynamic – Dynamic Ad Insertion (DAI)&amp;lt;/small&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
|| &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - DCR measures content with dynamic ads || Yes || Nielsen&lt;br /&gt;
|-&lt;br /&gt;
| segB || One of two custom segment for the clients granular reporting within a brand. || Examples:&amp;lt;br&amp;gt;Genre - &amp;lt;code&amp;gt;horror&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comedy&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;Timeslot - &amp;lt;code&amp;gt;primetime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;daytime&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;News type - &amp;lt;code&amp;gt;breakingnews&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;weather&amp;lt;/code&amp;gt;, etc. || Optional || Client &lt;br /&gt;
|-style=&amp;quot;background-color:#e9f9fa;&amp;quot;&lt;br /&gt;
| segC || One of two custom segment for the clients granular reporting within a brand. || Examples:&amp;lt;br&amp;gt;Genre - &amp;lt;code&amp;gt;horror&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comedy&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;Timeslot - &amp;lt;code&amp;gt;primetime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;daytime&amp;lt;/code&amp;gt;, etc.&amp;lt;br&amp;gt;News type - &amp;lt;code&amp;gt;breakingnews&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;weather&amp;lt;/code&amp;gt;, etc. || Optional || Client &lt;br /&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.&lt;br /&gt;
&lt;br /&gt;
Examples regarding usage of segments within SDK:&lt;br /&gt;
* All comedy clips and stories for a Brand rolled into a &amp;quot;Comedy&amp;quot; segment&lt;br /&gt;
* genre grouping content by Comedy vs. Drama&lt;br /&gt;
* group related Text + Video content - i.e. for a show that has a lot of - static pages associated with it&lt;br /&gt;
* packaging based on how clients sell inventory&lt;br /&gt;
* grouping related types of content either by genre, category or platform.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Android DCR Video Step 4 - Basic Set of Events - Sample Playback ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv12&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 4 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv12&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Configure API Calls =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== SDK Events =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!  Parameter !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'play'  ||  || Call at start of each new stream&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'  || content/ad metadata object || Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
| 'setPlayheadPosition' || playhead position as integer&amp;lt;br/&amp;gt;&lt;br /&gt;
VOD: || current position in seconds &amp;lt;br/&amp;gt;&lt;br /&gt;
Live: current Unix timestamp (seconds since Jan-1-1970 UTC) &amp;lt;br/&amp;gt;&lt;br /&gt;
Note: 'setPlayheadPosition' has to be called every second&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' || playhead position || Call during any interruption to content or Ad playback and at the end of each Ad.&lt;br /&gt;
|-&lt;br /&gt;
| 'end' || playhead position in seconds || Call when the current video asset completes playback and pass the playhead position. &amp;lt;br/&amp;gt;&lt;br /&gt;
Example: At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: For livestream, send the Unix timestamp; for VOD send the time in seconds as integer. The final playhead position must be sent for the current asset being played before calling &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; or&amp;lt;code&amp;gt; '''loadmetadata'''&amp;lt;/code&amp;gt;,.&amp;lt;/blockquote&amp;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. The &amp;lt;code&amp;gt;'''play'''&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; 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;
## &amp;lt;code&amp;gt;'''setplayheadPosition'''&amp;lt;/code&amp;gt; – Call this API every one second when playhead position timer is fired.  If a LIVE event, use the current Unix timestamp (seconds since Jan-1-1970 UTC).&lt;br /&gt;
## &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt; – Call this API when the playback is paused, switches between content and ad (within the same content playback) or encounters interruptions.&lt;br /&gt;
## &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; – Call when content completes. When called, the SDK instance exits from Processing state.&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 set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
&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, &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; and   &amp;lt;code&amp;gt;'''playheadPosition'''&amp;lt;/code&amp;gt; &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API Call Sequence ===&lt;br /&gt;
==== Sample Use Case: Content has no Advertisements ====&lt;br /&gt;
Call [[play()]] at start of stream&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;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(); &amp;lt;/code&amp;gt; || // Call at start of each new stream&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;
| Interruption || &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // call stop when content playback is interrupted&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Resume Content || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt;  || // Call loadMetadata and pass content metadata object when content resumes&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // continue pasing playhead position every second starting from position where content is resumed&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keep Going ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv13&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv13&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Congratulations, you've successfully integrated the Android SDK in your app for a basic content playback scenario!&lt;br /&gt;
&lt;br /&gt;
You can add more content to see channel-change scenarios or continue to next steps below.&lt;br /&gt;
&lt;br /&gt;
View your application's debug logs and search for the term (AppSDK) to see messages emitted by Nielsen AppSDK during video playback.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Next Steps ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv14&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv14&amp;quot;&amp;gt;&lt;br /&gt;
====Going Live====&lt;br /&gt;
&lt;br /&gt;
In addition to the basic steps above, before going live developers need to handle app background/foreground events, make certain privacy disclosures, handle interruption events (stop, fast-forward, rewind), and allow users to opt out of Nielsen measurement. More details can be found [[DCR_Video_Android_SDK|here]], along with a more comprehensive reference for implementing DCR Video measurement with AppSDK.&lt;br /&gt;
&lt;br /&gt;
Once the DCR Tracking Code is added, Nielsen will validate the implementation. Following Nielsen testing, developers need to make a few updates to the initialization call to ensure that the app is being measured properly.&lt;br /&gt;
&lt;br /&gt;
#'''App ID''': Ensure that correct  is used during initialization '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'''&lt;br /&gt;
#'''Debug Logging''': Disable logging by changing initialization call to use @&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;INFO&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;amp;rarr; Android DTVR ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision100&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide Android DTVR &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision100&amp;quot;&amp;gt;&lt;br /&gt;
==== Android DTVR Introduction ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv200-&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide Intro &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv200-&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen DTVR (Digital TV Ratings) product provides content consumption measurement in client mobile apps and webpages. This measurement includes insight into the total time a user spent watching the tracked content, video player events, and much more.&lt;br /&gt;
This example provides the steps to implement the DTVR product in a sample Android app using Nielsen AppSDK. It includes:&lt;br /&gt;
&lt;br /&gt;
*SDK Initialization&lt;br /&gt;
*DTVR Video Metadata: information about the content being tracked&lt;br /&gt;
*DTVR Video Events/API calls&lt;br /&gt;
*Extracting ID3 tags from the video stream and passing to AppSDK for measurement&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you will have the needed steps to integrate Nielsen's AppSDK in the background of your app for DTVR measurement.&lt;br /&gt;
&lt;br /&gt;
'''NOTE: video streams must have Nielsen ID3 tags embedded in order to be measured using the DTVR product. See the section in this guide &amp;quot;Extracting ID3 Tags&amp;quot; or contact your Nielsen representative for more information.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Android DTVR Step 1 - Obtain AppID ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv300&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 1 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv300&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To begin using the Android AppSDK, you will need to obtain an Application ID (AppId)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! Item !! Description !! Source&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;#9989; || App ID (appid) || Unique ID assigned to the player/site and configured by product || Contact your Nielsen Representative&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the AppSDK in the app.&lt;br /&gt;
&amp;lt;/br&amp;gt;Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Android DTVR Step 2 - SDK Initialization ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision400&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 2 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision400&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Configuring Android Development Environment =====&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;
*The Nielsen App SDK can also be added via [https://engineeringportal.nielsen.com/docs/Digital_Measurement_Android_Artifactory_Guide Artifact Repository].&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;
&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.gradle (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
&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 &amp;quot;+&amp;quot; button and search for &amp;lt;code&amp;gt;&amp;quot;*play-services*&amp;quot;&amp;lt;/code&amp;gt;.  Then select the most recent version of the play-services Artifact.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
&lt;br /&gt;
===== Google AD ID Permissions =====&lt;br /&gt;
The following is required if target API level is set to 31 (Android 12) with the Ad Version of the Nielsen SDK.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;com.google.android.gms.permission.AD_ID&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&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;&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;code&amp;gt;&amp;lt;application&amp;gt;&amp;lt;/code&amp;gt; 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;
* 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;
&lt;br /&gt;
The following table contains the list of arguments that can be passed via the AppInfo JSON schema.&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 Nielsen ID for the application. The ID is a GUID data type. If you did not receive your App ID, let us know and we will provide you. || Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&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;
&lt;br /&gt;
== Debug flag for development environment ==&lt;br /&gt;
Player application developers / integrators can use Debug flag to check whether an App SDK API call made is successful. To activate the Debug flag,&lt;br /&gt;
Pass the argument &amp;lt;code&amp;gt;@&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;DEBUG&amp;quot;&amp;lt;/code&amp;gt;, in the JSON string . The permitted values are:&lt;br /&gt;
&lt;br /&gt;
* '''INFO''': Displays the API calls and the input data from the application (validate player name, app ID, etc.). It can be used as certification Aid.&lt;br /&gt;
* '''WARN''': Indicates potential integration / configuration errors or SDK issues.&lt;br /&gt;
* '''ERROR''': Indicates important integration errors or non-recoverable SDK issues.&lt;br /&gt;
* '''DEBUG''': Debug logs, used by the developers to debug more complex issues.&lt;br /&gt;
&lt;br /&gt;
Once the flag is active, it logs each API call made and the data passed. The log created by this flag is minimal.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': DO NOT activate the Debug flag in a production environment.&amp;lt;/blockquote&amp;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;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;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;) 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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Android DTVR Step 3 - Create DTVR Content Metadata Object ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv500&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 3 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv500&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Configure Metadata =====&lt;br /&gt;
Content metadata should remain constant throughout the completion of an episode or live stream.&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 of asset	|| &amp;quot;content&amp;quot;	|| &lt;br /&gt;
|-&lt;br /&gt;
| adModel	|| linear vs dynamic ad model	|| 1 = Linear  matches TV ad load      || ✓&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;   &lt;br /&gt;
    public JSONObject loadDtvr() {&lt;br /&gt;
     try {&lt;br /&gt;
            dtvrdata = new JSONObject()&lt;br /&gt;
                    .put( &amp;quot;type&amp;quot;,&amp;quot;content&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;adModel&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        return dtvrdata;&lt;br /&gt;
    }&lt;br /&gt;
    &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Android DTVR Step 4 - Basic Set of Events - Sample Playback ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv600&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 4 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv600&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== SDK Events/APIs =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each asset to pass type and adModel.&lt;br /&gt;
|-&lt;br /&gt;
| 'sendID3'	|| Used to send the ID3 tag payload retrieved from the stream || Needs to be called at the beginning of playback&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Configure API calls - loadMetadata =====&lt;br /&gt;
Use &amp;lt;code&amp;gt;loadMetadata&amp;lt;/code&amp;gt; to pass the metadata object created above. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; appSdk.loadMetadata(dtvrdata);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Configure API calls - sendID3 =====&lt;br /&gt;
[[sendID3]] API is a receiver for timed metadata events (ID3 tags. This API filters out Nielsen-specific ID3 tags from the system and buffers the data for transfer to Nielsen’s collection facility.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; //Sending ID3 tag to SDK.&lt;br /&gt;
appSdk.sendID3(id3String);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
'''Sample ID3 tags''' &lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
Refer to [[Android SDK API Reference#Retrieving ID3 Tags|Retrieving ID3 Tags]] section to know more details.&lt;br /&gt;
&lt;br /&gt;
===== Retrieving ID3 Tags =====&lt;br /&gt;
ID3 tags have a payload of about 249 characters and start with &amp;quot;www.nielsen.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=====  Examples of extracting ID3 tags fromAndroid Native Media Player =====&lt;br /&gt;
As the Android Media Player versions (prior to Android 6 / Android API 23) do not support ID3, Nielsen has created a library that becomes an extension to the media player, thus MPX. This library extracts the ID3 tags and sends them to the app. For more information on how to use the MPX component, refer to the Nielsen-supplied sample application.&lt;br /&gt;
&lt;br /&gt;
Starting from '''Android 6 (Android API 23)''', Android Native Media Player allows apps to register a callback to be invoked, when a selected track has the timed metadata available. Currently, only HTTP Live Streaming (HLS) data URI’s embedded with timed ID3 tags generate TimedMetadata. Once the HLS video starts, call onTimedMetaDataAvailable() as and when the player observes a TimedMetadata (ID3 tag).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;@Override&lt;br /&gt;
    public void onTimedMetaDataAvailable(MediaPlayer mediaPlayer, TimedMetaData timedMetaData) {&lt;br /&gt;
&lt;br /&gt;
        if(timedMetaData != null &amp;amp;&amp;amp; timedMetaData.getMetaData() != null &amp;amp;&amp;amp; mMediaPlayer.isPlaying()){&lt;br /&gt;
&lt;br /&gt;
            //getting metadata.&lt;br /&gt;
            String iD3Payload = new String(timedMetaData.getMetaData(), StandardCharsets.UTF_8);&lt;br /&gt;
&lt;br /&gt;
            //If tag metadata contains &amp;quot;www.nielsen.com&amp;quot;, then only sending to SDK&lt;br /&gt;
            if (null != iD3Payload &amp;amp;&amp;amp; iD3Payload.contains(&amp;quot;www.nielsen.com&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                //getting index&lt;br /&gt;
                int index = iD3Payload.indexOf(&amp;quot;www.nielsen.com&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                //getting substring as ID3 tag will be of 249 characters&lt;br /&gt;
                String id3String = iD3Payload.substring(index, (index + 249));&lt;br /&gt;
                Log.d(TAG, &amp;quot;TimedMetaData ID3 Tag:&amp;quot; + id3String);&lt;br /&gt;
&lt;br /&gt;
                //Sending ID3 tag to SDK.&lt;br /&gt;
                appSdk.sendID3(id3String);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;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. &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 loadMetadata and sendID3 events to occur.&lt;br /&gt;
# '''Processing state''' – The SDK instance is processing playing information. The &amp;lt;code&amp;gt;'''loadMetadata'''&amp;lt;/code&amp;gt; call moves the SDK instance into this state. In this state, the SDK instance will be able to process sendID3 calls and measure content.&lt;br /&gt;
# '''Disabled state''' – The SDK instance is disabled.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keep Going ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv900&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv900&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Congratulations, you've successfully integrated the Android SDK in your app for a basic content playback scenario!&lt;br /&gt;
&lt;br /&gt;
You can add more content to see channel-change scenarios or continue to next steps below.&lt;br /&gt;
&lt;br /&gt;
View your application's debug logs and search for the term (AppSDK) to see messages emitted by Nielsen AppSDK during video playback.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Next Steps ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv1000&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv1000&amp;quot;&amp;gt;&lt;br /&gt;
====Going Live====&lt;br /&gt;
&lt;br /&gt;
In addition to the basic steps above, before going live developers need to handle app background/foreground events, make certain privacy disclosures, handle interruption events (stop, fast-forward, rewind), and allow users to opt out of Nielsen measurement. More details can be found [[DTVR_Android_SDK|here]], along with a more comprehensive reference for implementing DTVR measurement with AppSDK.&lt;br /&gt;
&lt;br /&gt;
Once the DTVR Tracking Code is added, Nielsen will validate the implementation. Following Nielsen testing, developers need to make a few updates to the initialization call to ensure that the app is being measured properly.&lt;br /&gt;
&lt;br /&gt;
#'''App ID''': Ensure that correct  is used during initialization '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'''&lt;br /&gt;
#'''Debug Logging''': Disable logging by changing initialization call to use @&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;INFO&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=BSDK_Step_By_Step&amp;diff=6586</id>
		<title>BSDK Step By Step</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=BSDK_Step_By_Step&amp;diff=6586"/>
		<updated>2024-03-27T02:49:03Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
Provided below are step-by-step quick start guides for implementing Nielsen Browser SDK for DCR Static, DCR Video, and DTVR products. Click each section to get started. &lt;br /&gt;
&lt;br /&gt;
== &amp;amp;rarr; BSDK DCR Static ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide DCR Static &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSDK DCR Static Introduction ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisiona-&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide Intro &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisiona-&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Digital Content Ratings (DCR) Static product provides content consumption measurement on client webpages. This measurement includes insight into the total time a user spent on a webpage, how they navigated through the page via links, and many other data points.&lt;br /&gt;
This tutorial provides the steps to implement the DCR Static product on a standard HTML webpage. It includes:&lt;br /&gt;
&lt;br /&gt;
*Static Queue Snippet: allows for SDK API calls while SDK and configuration file is loading onto page&lt;br /&gt;
*SDK Initialization Call: initializes the SDK and static configuration file&lt;br /&gt;
*DCR Static Metadata: information about the page(s) being tracked&lt;br /&gt;
*staticStart Event: event that starts SDK measurement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you'll have a webpage that is running Nielsen's Browser SDK in the background:&lt;br /&gt;
&amp;lt;/br&amp;gt;[[File:BSDK DCR Static Ex.png|1000px]]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Static Step 1 - Obtain AppID ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisiona&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 1 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisiona&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To begin using the Browser SDK (BSDK) you will need to obtain an Application ID (AppId)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! Item !! Description !! Source&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;#9989; || App ID (appid) || Unique ID assigned to the player/site and configured by product || Contact your Nielsen TAM&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the BSDK on the webpage.&lt;br /&gt;
&amp;lt;/br&amp;gt;Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Static Step 2 - Add Static Queue Snippet ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionb&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 2 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create HTML page in your preferred editor. In order for SDK to begin tracking, the following code snippet up must be added in a &amp;lt;script&amp;gt; tag to be inserted in &amp;lt;head&amp;gt; tag of the HTML page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static Sample Page&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://www.w3schools.com/w3css/4/w3.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://fonts.googleapis.com/css?family=Raleway&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
  body,h1,h2,h3,h4,h5 {font-family: &amp;quot;Raleway&amp;quot;, sans-serif}&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    // Static Queue Snippet&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Static Step 3 - Make SDK Initialization Call ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionc&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 3 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionc&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a variable named nSdkInstance and initialize SDK by passing in your App ID into the NOLBUNDLE.nslq() method. Add the following code after the static queue snippet code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
// SDK Initialization call&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: 'debug' // ONLY FOR TESTING! REMOVE BEFORE MOVING TO PRODUCTION&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the initialization call is made, a unique static config file, PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX.js, will be loaded on to the page based on the appid and cached by the client-side browser(s).&lt;br /&gt;
Once the static config file is loaded onto the page, the SDK ('''nlsSDK600.bundle.min.js''') will be fully downloaded and initialized.&lt;br /&gt;
The initialization call has three parameters:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Description !! Values&lt;br /&gt;
|-&lt;br /&gt;
| App ID (appid) || Unique ID assigned to player/site || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || Any string value&lt;br /&gt;
|-&lt;br /&gt;
| options || Options to be added during initialization || nol_sdkDebug, optout&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTE: REMOVE &amp;lt;nol_sdkDebug&amp;gt; OPTION BEFORE GOING INTO PRODUCTION RELEASE'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Static Step 4 - Create DCR Static Metadata Object ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisiond&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 4 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisiond&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create metadata object which contains information about the static webpage. Add the following code after SDK initialization code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// DCR Static Metadata Object&lt;br /&gt;
var nielsenMetadata = {&lt;br /&gt;
  type: 'static', // type of content [required]&lt;br /&gt;
  assetid: 'HHF887465-9486', // unique ID for each article [required]&lt;br /&gt;
  section: 'HOME', //  section of site [required]&lt;br /&gt;
  segA: '', // custom segment [optional]&lt;br /&gt;
  segB: '', // custom segment [optional]&lt;br /&gt;
  segC: ''  // custom segment [optional]&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Metadata Object Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Fixed/Dynamic !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| type || asset type || fixed || 'static' || Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom (no [[Special Characters]]) || 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 (no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Metadata can be passed through key-values using the Nielsen reserved keys. The tracking code includes the Nielsen reserved keys and placeholder values.&lt;br /&gt;
Pass dynamic metadata for the keys with the value (e.g. section:)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Static Step 5 - Call ggPM staticStart event ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisione&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 5 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisione&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Static Start Event====&lt;br /&gt;
Make BSDK API call ggPM() passing in the event staticstart as the first parameter and metadata variable as the second parameter. Add the following code after creating your DCR Static metadata object:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM('staticstart', staticMetadata);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The content metadata object is passed as a parameter when calling staticstart event.&lt;br /&gt;
&lt;br /&gt;
====Static End Event====&lt;br /&gt;
Call the Browser SDK ggPM() API by passing in the event staticend as the first parameter and metadata variable as the second parameter. In case metadata for another site section has been previously loaded, the staticend API call for that section should be made prior to loading in new metadata (different assetid/section) using a new staticstart API call.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nSdkInstance.ggPM('staticend', staticMetadata);&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
The content metadata object is passed as a parameter when calling staticend event.&lt;br /&gt;
&lt;br /&gt;
The API call for staticend is not a requirement for all DCR Static integrations, however if client integration is a '''Single Page Application (SPA)''' it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
&lt;br /&gt;
Do not place this call inside beforeunload browser event, because Browser SDK needs some time and resources to deliver data to the cloud.&lt;br /&gt;
&lt;br /&gt;
NOTE: The information on staticend is provided here for reference. The demo site code does not make use of staticend.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Static Step 6 - Update Page Content ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionf&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 6 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionf&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As mentioned in the [[#BSDK DCR Static Step 4 - Create DCR Static Metadata Object|Create Metadata Object]] section, the section metadata property correlates to the section of the website the user is currently on. Examples include the home, about, contact, etc. sections often found on webpages.&lt;br /&gt;
To properly credit the section of the page the user is currently viewing, you must make sure that the section metadata property correctly corresponds with the section or page of the site that the user is currently on.&lt;br /&gt;
If a user navigates to the contact section of our website (www.example.com/contact) we would have the following in our metadata object:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
// DCR Static Metadata Object&lt;br /&gt;
var nielsenMetadata = {&lt;br /&gt;
  type: 'static', // type of content [required]&lt;br /&gt;
  assetid: 'HHF887465-9486', // unique ID for each article [required]&lt;br /&gt;
  section: 'CONTACT', //  section of site [required]&lt;br /&gt;
  segA: '', // custom segment [optional]&lt;br /&gt;
  segB: '', // custom segment [optional]&lt;br /&gt;
  segC: ''  // custom segment [optional]&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' DCR Static is not currently supported in iframe windows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Keep Going ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisiong&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisiong&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Congratulations, you've successfully integrated the Browser SDK on your web page!&lt;br /&gt;
&lt;br /&gt;
[[File:BSDK DCR Static Ex1.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
Final code output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static Test Page&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    // Static Queue Snippet&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization [update with your App Id]&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: &amp;quot;debug&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
// DCR Static Metadata Object&lt;br /&gt;
var nielsenMetadata = {&lt;br /&gt;
  type: 'static', // type of content [required]&lt;br /&gt;
  assetid: 'HHF887465-9486', // unique ID for each article [required]&lt;br /&gt;
  section: 'HOME', //  section of site [required]&lt;br /&gt;
  segA: '', // custom segment [optional]&lt;br /&gt;
  segB: '', // custom segment [optional]&lt;br /&gt;
  segC: ''  // custom segment [optional]&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    // Call staticStart Event&lt;br /&gt;
    nSdkInstance.ggPM(&amp;quot;staticstart&amp;quot;, nielsenMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body class=&amp;quot;w3-light-grey&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;w3-content&amp;quot; style=&amp;quot;max-width:1400px&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;header class=&amp;quot;w3-container w3-center w3-padding-32&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;h1&amp;gt;&amp;lt;b&amp;gt;DCR Static Sample Web Page&amp;lt;/b&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Sample page with Nielsen's DCR Static Browser SDK integration&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;w3-row&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;w3-col l8 s12&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;w3-card-4 w3-margin w3-white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;img src=&amp;quot;/images/n-logo-aud.avif&amp;quot; alt=&amp;quot;Nielsen&amp;quot; style=&amp;quot;width: 60%;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;w3-container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h3&amp;gt;&amp;lt;b&amp;gt;DCR Static&amp;lt;/b&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
        &amp;lt;h5&amp;gt;Sample Page&amp;lt;/h5&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
      &amp;lt;div class=&amp;quot;w3-container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Mauris neque quam, fermentum ut nisl vitae, convallis maximus nisl. Sed mattis nunc id lorem euismod placerat. Vivamus porttitor magna enim, ac accumsan tortor cursus at. Phasellus sed ultricies mi non congue ullam corper. Praesent tincidunt sed&lt;br /&gt;
          tellus ut rutrum. Sed vitae justo condimentum, porta lectus vitae, ultricies congue gravida diam non fringilla.&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;w3-row&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;w3-col m8 s12&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;p&amp;gt;&amp;lt;button class=&amp;quot;w3-button w3-padding-large w3-white w3-border&amp;quot;&amp;gt;&amp;lt;b&amp;gt;READ MORE »&amp;lt;/b&amp;gt;&amp;lt;/button&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;w3-col m4 w3-hide-small&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;w3-padding-large w3-right&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Comments  &amp;lt;/b&amp;gt; &amp;lt;span class=&amp;quot;w3-tag&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&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;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;hr&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;w3-col l4&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;w3-card w3-margin w3-margin-top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;img src=&amp;quot;/images/arrows.jpeg&amp;quot; style=&amp;quot;width: 100%; height: 300px;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;w3-container w3-white&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h4&amp;gt;&amp;lt;b&amp;gt;DCR Static&amp;lt;/b&amp;gt;&amp;lt;/h4&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;The Digital Content Ratings (DCR) Static product provides content consumption measurement on client webpages. This measurement includes insight into the total time a user spent on a webpage, how they navigated through the page via links, and many other data points.&amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&amp;lt;hr&amp;gt;&lt;br /&gt;
    &amp;lt;hr&amp;gt; &lt;br /&gt;
    &amp;lt;div class=&amp;quot;w3-card w3-margin&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;w3-container w3-padding&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h4&amp;gt;Tags&amp;lt;/h4&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;w3-container w3-white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;w3-tag w3-black w3-margin-bottom&amp;quot;&amp;gt;DCR&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;w3-tag w3-light-grey w3-small w3-margin-bottom&amp;quot;&amp;gt;Static&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;w3-tag w3-light-grey w3-small w3-margin-bottom&amp;quot;&amp;gt;BSDK&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;w3-tag w3-light-grey w3-small w3-margin-bottom&amp;quot;&amp;gt;Measurement&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;w3-tag w3-light-grey w3-small w3-margin-bottom&amp;quot;&amp;gt;DCR&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/p&amp;gt;&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;
  &amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;footer class=&amp;quot;w3-container w3-dark-grey w3-padding-32 w3-margin-top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;button class=&amp;quot;w3-button w3-black w3-disabled w3-padding-large w3-margin-bottom&amp;quot;&amp;gt;Previous&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;button class=&amp;quot;w3-button w3-black w3-padding-large w3-margin-bottom&amp;quot;&amp;gt;Next »&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Powered by &amp;lt;a href=&amp;quot;https://www.w3schools.com/w3css/default.asp&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;w3.css&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/footer&amp;gt;  &lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&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;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Next Steps ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisioni&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisioni&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that you've integrated DCR Static for the BSDK, what's next?&lt;br /&gt;
&lt;br /&gt;
====How to debug BSDK integration?====&lt;br /&gt;
In your browser's dev tools menu (Chrome and Edge - press F12) you can inspect the various elements and sources. Here you can see pings being sent by the SDK and various JavaScript sources. Debug-level console logs will be shown if BSDK is debug mode (which you configured during this tutorial).&lt;br /&gt;
[[File:BSDK DCR Static Ex1.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
====Going Live====&lt;br /&gt;
&lt;br /&gt;
In addition to the basic steps above, before going live developers need to make certain privacy disclosures and allow users to opt out of Nielsen measurement. More details can be found [[DCR_Static_Browser_SDK_(6.0.0)|here]], along with a more comprehensive reference for implementing DCR Static measurement with BSDK.&lt;br /&gt;
&lt;br /&gt;
Once the DCR Tracking Code is added, Nielsen will validate the implementation. Following Nielsen testing, developers need to make a couple of updates to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
&lt;br /&gt;
#'''App ID''': Ensure that correct  is used during initialization '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'''&lt;br /&gt;
#'''Debug Logging''': Disable logging by deleting {nol_sdkDebug: 'debug'} from initialization call.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PRODUCTION Initialization Call - Refer to the production initialization call below:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;amp;rarr; BSDK DCR Video ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision1&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide DCR Video &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== BSDK DCR Video Introduction ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv1-&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide Intro &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv1-&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Digital Content Ratings (DCR) Video product provides content consumption measurement on client webpages. This measurement includes insight into the total time a user spent watching the tracked content, video player events, and much more.&lt;br /&gt;
This example provides the steps to implement the DCR Video product using the HTML Video Embed Element. It includes:&lt;br /&gt;
&lt;br /&gt;
*Static Queue Snippet: allows for SDK API calls while SDK and configuration file is loading onto page&lt;br /&gt;
*SDK Initialization Call: initializes the SDK and static configuration file&lt;br /&gt;
*DCR Video Metadata: information about the player being tracked&lt;br /&gt;
*Playhead Event Sequence: event(s) that starts and tracks player measurement&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you'll have a webpage that is running Nielsen's Browser SDK during video playback:&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
[[File:BSDK DCR Video EX.png|1000px]]&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Video Step 1 - Obtain AppID ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv2&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 1 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To begin using the Browser SDK (BSDK) you will need to obtain an Application ID (AppId)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! Item !! Description !! Source&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;#9989; || App ID (appid) || Unique ID assigned to the player/site and configured by product || Contact your Nielsen TAM&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the BSDK on the webpage.&lt;br /&gt;
&amp;lt;/br&amp;gt;Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Video Step 2 - Add Static Queue Snippet ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv3&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 2 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create HTML page in your preferred editor. In order for SDK to begin tracking, the following code snippet up must be added in a &amp;lt;script&amp;gt; tag to be inserted in &amp;lt;head&amp;gt; tag of the HTML page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static Sample Page&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://www.w3schools.com/w3css/4/w3.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://fonts.googleapis.com/css?family=Raleway&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
  body,h1,h2,h3,h4,h5 {font-family: &amp;quot;Raleway&amp;quot;, sans-serif}&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    // Static Queue Snippet&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Video Step 3 - Make SDK Initialization Call ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv4&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 3 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv4&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a variable named nSdkInstance and initialize SDK by passing in your App ID into the NOLBUNDLE.nslq() method. Add the following code after the static queue snippet code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// SDK Initialization call&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;sdk-video-instance&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: &amp;quot;debug&amp;quot; // ONLY FOR TESTING! REMOVE BEFORE MOVING TO PRODUCTION&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the initialization call is made, a unique static config file, PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX.js, will be loaded on to the page based on the appid and cached by the client-side browser(s).&lt;br /&gt;
Once the static config file is loaded onto the page, the SDK ('''nlsSDK600.bundle.min.js''') will be fully downloaded and initialized.&lt;br /&gt;
The initialization call has three parameters:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Description !! Values&lt;br /&gt;
|-&lt;br /&gt;
| App ID (appid) || Unique ID assigned to player/site || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || Any string value&lt;br /&gt;
|-&lt;br /&gt;
| options || Options to be added during initialization || nol_sdkDebug, optout, enableFpid&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTE: REMOVE &amp;lt;nol_sdkDebug&amp;gt; OPTION BEFORE GOING INTO PRODUCTION RELEASE'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Video Step 4 - Create DCR Video Content Metadata Object ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv5&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 4 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv5&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create metadata object(s) which contains information about the video. There are two types of asset metadata:&lt;br /&gt;
&lt;br /&gt;
*content: identify video&lt;br /&gt;
*ad: identify each ad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// DCR Video Metadata Object&lt;br /&gt;
var contentMetadataObject = {&lt;br /&gt;
  type: 'content', // type of content [required]&lt;br /&gt;
  assetid: 'VID-123456', // unique ID for each asset [required]&lt;br /&gt;
  program: 'program name', // name of program [required]&lt;br /&gt;
  title: 'episode title with season and episode number', // ex: S1E3 [required]&lt;br /&gt;
  length: 'length in seconds', // length of content [required]&lt;br /&gt;
  airdate: '20210321 09:00:00', // airdate of broadcast [required]&lt;br /&gt;
  isfullepisode: 'y', // long form content [required]&lt;br /&gt;
  adloadtype: '2', // type of ad load (linear/dynamic) [required]&lt;br /&gt;
  segB: 'custom segment B', // [optional]&lt;br /&gt;
  segC: 'custom segment C', // [optional]&lt;br /&gt;
  crossId1: 'Standard Episode ID', // [optional]&lt;br /&gt;
  crossId2: 'Content Originator' // [optional]&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For this example, we are only going to create content metadata. For information on Ad integration click [[Digital_Measurement_Metadata|Digital Measurement Metadata]] and see &amp;quot;Ad Metadata&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
'''Content Metadata Object Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Values !! Required? !! Provider&lt;br /&gt;
|-&lt;br /&gt;
| type || asset type || content || Yes || Nielsen&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID assigned to asset &amp;lt;br&amp;gt;''Note: Refrain from using the following special characters'' [[Special_Characters|Special Characters]] || Examples:&amp;lt;br&amp;gt;BBT345a234&amp;lt;br&amp;gt;CBSs5e234F2021 || Yes || Client&lt;br /&gt;
|-&lt;br /&gt;
| program || Complete program or movie title (no abbreviations or shorthand)&amp;lt;br&amp;gt;''Note: 25 character limit'' || Examples:&amp;lt;br&amp;gt;The Big Bang Theory&amp;lt;br&amp;gt;TheBigBangTheory&amp;lt;br&amp;gt;The Dark Knight&amp;lt;br&amp;gt;TheDarkKnight || Yes || Client&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title with season and episode number (40 character limit)&amp;lt;br&amp;gt;(Formats accepted: S01E03, S1E3, S1 E3) || Examples:&amp;lt;br&amp;gt;The Pants Alternative S03E18&amp;lt;br&amp;gt;The Pants Alternative S3E18&amp;lt;br&amp;gt;The Pants Alternative S3 E18&amp;lt;br&amp;gt;Can also accept:S3E18&amp;lt;br&amp;gt;Not Valid: 318 or 0318 || Yes || Client&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Gracenote TMS ID (If available) should be passed for all telecasted content for clients using the Gracenote solution for proper matching purposes&amp;lt;br&amp;gt;''Note: The TMS ID will be a 14 character string. Normally leading with 2 alpha characters ('EP', 'MV', 'SH' or 'SP'), followed by 12 numbers'' || The TMS ID will be a 14 character string. Normally with 'EV,' 'EP', 'SH', 'SP', or 'MV' followed by 12 numbers after the initial two letter prefix.&amp;lt;br&amp;gt;Examples:&amp;lt;br&amp;gt;The Giant Morning Show:SH009311820022&amp;lt;br&amp;gt;The Pants Alternative Episode:EP009311820061 || No || Nielsen&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Populated by content distributor to contribute viewing from that distributor to the given content originator || Custom&amp;lt;br&amp;gt;For a full list of acceptable values, please contact your Nielsen representative. || Yes, for distributors || Nielsen&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds&amp;lt;br&amp;gt;''Note: Integers and decimals are acceptable values are acceptable for the length parameter'' || Examples:&amp;lt;br&amp;gt;For standard VOD content - 300 to represent 5 minutes, 1320to represent 22 minutes, etc.&amp;lt;br&amp;gt;If DAI live stream of a discrete program (Live Event/Sporting Event), pass length of content. See example for standard VOD content above.If unknown DAI live steam, pass a value of 0 || Yes || Client&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original broadcast or release date for the program:&amp;lt;br&amp;gt;- For USA, date should be EST&amp;lt;br&amp;gt;- Outside USA, date should be local time&amp;lt;br&amp;gt;If not applicable or available, original broadcast or release date for the Program || Acceptable Formats:&amp;lt;br&amp;gt;YYYY-MM-DDTHH:MI:SS&amp;lt;br&amp;gt;YYYY-MM-DDHH:MI:SS&amp;lt;br&amp;gt;YYYY-MM-DDTHH:MI:SS+xx:xx&amp;lt;br&amp;gt;YYYY-MM-DDTHH:MI:SS-xx:xx&amp;lt;br&amp;gt;YYYYMMDDHH:MI:SS&amp;lt;br&amp;gt;YYYYMMDD HH:MI:SS&amp;lt;br&amp;gt;MM-DD-YYYY&amp;lt;br&amp;gt;MM/DD/YYYY&amp;lt;br&amp;gt;YYYYMMDD || Yes || Client&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag to identify differences between long form content || y - full episode&amp;lt;br&amp;gt;n - non full episode(clip,teaser,promo,etc.)&amp;lt;br&amp;gt;Also accept:&amp;lt;br&amp;gt;lf or yes - longform&amp;lt;br&amp;gt;sf or no - shortform || Yes || Nielsen&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load:&amp;lt;br&amp;gt;1 Linear - matches TV ad load&amp;lt;br&amp;gt;2 Dyanmic - Dynamic Ad Insertion (DAI) || DCR only uses '2' - DAI || Yes || Nielsen&lt;br /&gt;
|-&lt;br /&gt;
| segB || One of two custom segments for clients' granular reporting within a brand || Examples:&amp;lt;br&amp;gt;Genre- horror, comedy, etc.&amp;lt;br&amp;gt;Timeslot - primetime, daytime, etc.&amp;lt;br&amp;gt;News type - breakingnews, weather, etc. || No || Client&lt;br /&gt;
|-&lt;br /&gt;
| segC || One of two custom segments for clients' granular reporting within a brand || Examples:&amp;lt;br&amp;gt;Genre- horror, comedy, etc.&amp;lt;br&amp;gt;Timeslot - primetime, daytime, etc.&amp;lt;br&amp;gt;News type - breakingnews, weather, etc. || No || Client&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Segment Information'''&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&lt;br /&gt;
Examples regarding usage of segments within SDK:&lt;br /&gt;
&lt;br /&gt;
*All comedy clips and stories for a Brand rolled into a &amp;quot;Comedy&amp;quot; segment&lt;br /&gt;
*Genre grouping content by Comedy vs. Drama&lt;br /&gt;
*Group related Text + Video content, i.e. for a show that has a lot of - static pages associated with it&lt;br /&gt;
*Packaging based on how clients sell inventory&lt;br /&gt;
*Grouping related types of content either by genre, category or platform.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Video Step 5 - Add Video Player ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv6&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 5 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv6&amp;quot;&amp;gt;&lt;br /&gt;
Add the the video player element to the &amp;lt;body&amp;gt; of your HTML page:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;video controls src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
  poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot; width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Sorry, your browser doesn't support embedded videos,&lt;br /&gt;
  but don't worry, you can &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
  and watch it with your favorite video player!&lt;br /&gt;
&amp;lt;/video&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
If you already have the video the element on the page then proceed to the next step to setup video event listeners.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSDK DCR Video Step 6 - Set Up Event Listeners ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv7&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 6 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv7&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Setup Video Event Listeners'''&lt;br /&gt;
In order for the SDK to process player events, you must attach the Browser SDK events to the corresponding player events, e.g. play, pause, and loadmetadata.&lt;br /&gt;
&lt;br /&gt;
'''SDK Events'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !! Parameter !! Description&lt;br /&gt;
|-&lt;br /&gt;
| loadMetadata || content/ad metadata object || Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
| setPlayheadPosition || Playhead position as integer&amp;lt;br&amp;gt;For VOD: current position in seconds&amp;lt;br&amp;gt;For live content: current Unix timestamp (seconds since Jan-1-1970 UTC)&amp;lt;br&amp;gt;Note: setPlayheadPosition has to be called every second || Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| stop || playhead position in seconds || Call when content or ads complete playing and pass playhead position&lt;br /&gt;
|-&lt;br /&gt;
| end || playhead position in seconds || Call when the current video asset completes playback and pass the playhead position.&amp;lt;br&amp;gt;Example(s): At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Query video element'''&amp;lt;br&amp;gt;&lt;br /&gt;
First we are going to create a video.js file and setup our event listeners for the video player:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
// Setup Event Listeners w/ SDK Events&lt;br /&gt;
&lt;br /&gt;
// Select the video element&lt;br /&gt;
const video = document.querySelector('video');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''loadMetadata Event'''&amp;lt;br&amp;gt;&lt;br /&gt;
Before SDK can begin crediting, the loadMetadata event must be called at the beginning of each asset by passing the contentMetadata object that was created in the previous step.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
// Load contentMetadata object&lt;br /&gt;
video.addEventListener('loadedmetadata', (event) =&amp;gt; {&lt;br /&gt;
  // Call SDK loadmetadata event&lt;br /&gt;
  nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''setPlayheadPosition Event'''&amp;lt;br&amp;gt;&lt;br /&gt;
In order to accurately measure the time spent viewing you must pass in the playhead position of the video via the setPlayheadPosition event.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
// Send playhead positions&lt;br /&gt;
let playheadPosition = 0;&lt;br /&gt;
video.addEventListener('timeupdate', (event) =&amp;gt; {&lt;br /&gt;
  // Perform floor on currentTime property to get current position in seconds&lt;br /&gt;
  let currTime = Math.floor(video.currentTime);&lt;br /&gt;
&lt;br /&gt;
  // Safety check to make sure current time is greater than 0&lt;br /&gt;
  if(0 &amp;lt; currTime) {&lt;br /&gt;
    playheadPosition = currTime;&lt;br /&gt;
    // Call SDK setplayheadposition event passing in the current playhead&lt;br /&gt;
    nSdkInstance.ggPM(&amp;quot;setPlayheadPosition&amp;quot;, playheadPosition);&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;
'''stop Event'''&amp;lt;br&amp;gt;&lt;br /&gt;
If the player is paused at any time, need to call SDK's stop event and pass the current playhead position&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
// Handle Stop&lt;br /&gt;
video.addEventListener('pause', (event) =&amp;gt; {&lt;br /&gt;
  nSdkInstance.ggPM(&amp;quot;stop&amp;quot;, playheadPosition);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''end Event'''&amp;lt;br&amp;gt;&lt;br /&gt;
Once the stream has completed playback, call the end event and pass the ending playhead position.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Handle End&lt;br /&gt;
video.addEventListener('ended', (event) =&amp;gt; {&lt;br /&gt;
  nSdkInstance.ggPM(&amp;quot;end&amp;quot;, playheadPosition);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Complete video.js file'''&amp;lt;br&amp;gt;&lt;br /&gt;
Once complete the video.js file should look like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
// Setup Event Listeners w/ SDK Events&lt;br /&gt;
&lt;br /&gt;
// Select the video element&lt;br /&gt;
const video = document.querySelector('video');&lt;br /&gt;
&lt;br /&gt;
// Load contentMetadata object&lt;br /&gt;
video.addEventListener('loadedmetadata', (event) =&amp;gt; {&lt;br /&gt;
  // Call SDK loadmetadata event&lt;br /&gt;
  nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Send playhead positions&lt;br /&gt;
let playheadPosition = 0;&lt;br /&gt;
video.addEventListener('timeupdate', (event) =&amp;gt; {&lt;br /&gt;
  // Perform floor on currentTime property to get current position in seconds&lt;br /&gt;
  let currTime = Math.floor(video.currentTime);&lt;br /&gt;
&lt;br /&gt;
  // Safety check to make sure current time is greater than 0&lt;br /&gt;
  if(playheadPosition &amp;lt; currTime) {&lt;br /&gt;
    playheadPosition = currTime;&lt;br /&gt;
    // Call SDK setplayheadposition event passing in the current playhead&lt;br /&gt;
    nSdkInstance.ggPM(&amp;quot;setPlayheadPosition&amp;quot;, playheadPosition);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Handle Stop&lt;br /&gt;
video.addEventListener('pause', (event) =&amp;gt; {&lt;br /&gt;
  nSdkInstance.ggPM(&amp;quot;stop&amp;quot;, playheadPosition);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Handle End&lt;br /&gt;
video.addEventListener('ended', (event) =&amp;gt; {&lt;br /&gt;
  nSdkInstance.ggPM(&amp;quot;end&amp;quot;, playheadPosition);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Be sure to add &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot; inline&amp;gt;&amp;lt;script src=&amp;quot;video.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; right before the closing &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot; inline&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; tag in your HTML file!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Keep Going ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv8&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv8&amp;quot;&amp;gt;&lt;br /&gt;
Congratulations, you've successfully integrated the Browser SDK on your web page!&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:devtoolsbsd1.png|frameless|1000px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Final code output:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Video Test Page&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    // Static Queue Snippet&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&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;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;sdk-video-instance&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: &amp;quot;debug&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadataObject = {&lt;br /&gt;
      type: 'content', // type of content [required]&lt;br /&gt;
      assetid: 'VID-123456', // unique ID for each asset [required]&lt;br /&gt;
      program: 'program name', // name of program [required]&lt;br /&gt;
      title: 'episode title with season and episode number', // ex: S1E3 [required]&lt;br /&gt;
      length: 'length in seconds', // length of content [required]&lt;br /&gt;
      airdate: '20210321 09:00:00', // airdate of broadcast [required]&lt;br /&gt;
      isfullepisode: 'y', // long form content [required]&lt;br /&gt;
      adloadtype: '2', // type of ad load (linear/dynamic) [required]&lt;br /&gt;
      segB: 'custom segment B', // [optional]&lt;br /&gt;
      segC: 'custom segment C', // [optional]&lt;br /&gt;
      crossId1: 'Standard Episode ID', // [optional]&lt;br /&gt;
      crossId2: 'Content Originator' // [optional]&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;main&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;DCR Video Sample Page&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
      &amp;lt;video controls src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
        poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot; width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Sorry, your browser doesn't support embedded videos,&lt;br /&gt;
        but don't worry, you can &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
        and watch it with your favorite video player!&lt;br /&gt;
      &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/main&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;video.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;r&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
video.js&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
// Setup Event Listeners w/ SDK Events&lt;br /&gt;
&lt;br /&gt;
// Select the video element&lt;br /&gt;
const video = document.querySelector('video');&lt;br /&gt;
&lt;br /&gt;
// Load contentMetadata object&lt;br /&gt;
video.addEventListener('loadedmetadata', (event) =&amp;gt; {&lt;br /&gt;
  // Call SDK loadmetadata event&lt;br /&gt;
  nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Send playhead positions&lt;br /&gt;
let playheadPosition = 0;&lt;br /&gt;
video.addEventListener('timeupdate', (event) =&amp;gt; {&lt;br /&gt;
  // Perform floor on currentTime property to get current position in seconds&lt;br /&gt;
  let currTime = Math.floor(video.currentTime);&lt;br /&gt;
&lt;br /&gt;
  // Safety check to make sure current time is greater than 0&lt;br /&gt;
  if(playheadPosition &amp;lt; currTime) {&lt;br /&gt;
    playheadPosition = currTime;&lt;br /&gt;
    // Call SDK setplayheadposition event passing in the current playhead&lt;br /&gt;
    nSdkInstance.ggPM(&amp;quot;setPlayheadPosition&amp;quot;, playheadPosition);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Handle Stop&lt;br /&gt;
video.addEventListener('pause', (event) =&amp;gt; {&lt;br /&gt;
  nSdkInstance.ggPM(&amp;quot;stop&amp;quot;, playheadPosition);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Handle End&lt;br /&gt;
video.addEventListener('ended', (event) =&amp;gt; {&lt;br /&gt;
  nSdkInstance.ggPM(&amp;quot;end&amp;quot;, playheadPosition);&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;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Next Steps ===&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv9&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv9&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that you've integrated the BSDK, what's next?&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''How to debug BSDK integration?'''&lt;br /&gt;
In your browser's dev tools menu (Chrome and Edge - press F12) you can inspect the various elements and sources. Here you can see pings being sent by the SDK and various JavaScript sources. Debug-level console logs will be shown if BSDK is debug mode (which you configured during this tutorial).&lt;br /&gt;
[[File:devtoolsbsd1.png|frameless|1000px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Going Live'''&amp;lt;br&amp;gt;&lt;br /&gt;
Once the DCR Tracking Code is added, Nielsen will validate the implementation. Following Nielsen testing, users need to make a few updates to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
&lt;br /&gt;
#App ID: Ensure that correct  is used during initialization &amp;lt;br&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
#Debug Logging: Disable logging by deleting {nol_sdkDebug: 'debug'} from initialization call.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
PRODUCTION Initialization Call - Refer to the production initialization call below:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;sdk-video-instance&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;amp;rarr; BSDK DTVR Video ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision100&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide DTVR &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision100&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSDK DTVR Introduction ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv200&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide Intro &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv200&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Digital TV Ratings(DTVR) enables the crediting of viewing from mobile and PC devices to linear TV content that carried the same linear ad load. Digital screens can include both computers and mobile devices such as smartphones and tablets. This viewing is captured using a census-based methodology through the Nielsen SDK.&lt;br /&gt;
This example provides the steps to implement the DTVR product in live video stream. It includes:&lt;br /&gt;
&lt;br /&gt;
*'''Static Queue Snippet''': allows for SDK API calls while SDK and configuration file is loading onto page&lt;br /&gt;
*'''SDK Initialization Call''': initializes the SDK and static configuration file&lt;br /&gt;
*'''DTVR Metadata''': information about the player being tracked&lt;br /&gt;
*'''DTVR Event Sequence''': event(s) that start and track DTVR measurement&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you'll have a webpage that is running Nielsen's Browser SDK during video playback:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSDK DTVR Step 1 - Obtain AppID ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision300&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 1 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision300&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To begin using the Browser SDK (BSDK) you will need to obtain an Application ID (AppId)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! Item !! Description !! Source&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;#9989; || App ID (appid) || Unique ID assigned to the player/site and configured by product || Contact your Nielsen TAM&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the BSDK on the webpage.&lt;br /&gt;
&amp;lt;/br&amp;gt;Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSDK DTVR Step 2 - Add Static Queue Snippet ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivision400&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 2 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivision400&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create HTML page in your preferred editor. In order for SDK to begin tracking DTVR content the following code snippet must be added in a &amp;lt;script&amp;gt; tag to be inserted in &amp;lt;head&amp;gt; tag of the HTML page.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the SDK and configuration file(s) are being downloaded. Once the files are downloaded and the SDK is initialized on the page, the SDK will begin to empty the queue. It will process the API calls/events from the queue first and then process subsequent '''ggPM''' calls.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DTVR Sample Page&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://www.w3schools.com/w3css/4/w3.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://fonts.googleapis.com/css?family=Raleway&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
  body,h1,h2,h3,h4,h5 {font-family: &amp;quot;Raleway&amp;quot;, sans-serif}&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    // Static Queue Snippet&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSDK DTVR Step 3 - Make SDK Initialization Call ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv500&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 3 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv500&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a variable named '''nSdkInstance''' and initialize SDK by passing in your App ID into the '''NOLBUNDLE.nslq()''' method. Add the following code after the static queue snippet code from the previous step:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// SDK Initialization call&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;sdk-video-instance&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: &amp;quot;debug&amp;quot; // ONLY FOR TESTING! REMOVE BEFORE MOVING TO PRODUCTION&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the initialization call is made, a unique static config file, PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX.js, will be loaded on to the page based on the appid and cached by the client-side browser(s).&lt;br /&gt;
Once the static config file is loaded onto the page, the SDK ('''nlsSDK600.bundle.min.js''') will be fully downloaded and initialized.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The initialization call has three parameters:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Description !! Values&lt;br /&gt;
|-&lt;br /&gt;
| App ID (appid) || Unique ID assigned to player/site || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || Any string value&lt;br /&gt;
|-&lt;br /&gt;
| options || Options to be added during initialization || nol_sdkDebug, optout, enableFpid&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''NOTE: REMOVE &amp;lt;nol_sdkDebug&amp;gt; OPTION BEFORE GOING INTO PRODUCTION RELEASE'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSDK DTVR Step 4 - Create DTVR Metadata Object ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv600&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 4 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv600&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The metadata received for each asset is used for classification and reporting. Metadata can be passed through key-values using the Nielsen reserved keys. User will need to set up content object with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
=====Content Metadata Object=====&lt;br /&gt;
Create a metadata object which contains ad related information present in the episode/live stream. Add the following code after SDK initialization code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// DTVR Metadata Object&lt;br /&gt;
var contentMetadataObject = {&lt;br /&gt;
  type: 'content', // [required]&lt;br /&gt;
  adModel: '1' // [required]&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;
*Content metadata should remain constant throughout the completion of an episode or live stream.&lt;br /&gt;
&lt;br /&gt;
=====Content Metadata Object Properties=====&lt;br /&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;
| type || type of asset || &amp;quot;content&amp;quot; || yes&lt;br /&gt;
|-&lt;br /&gt;
| adModel || linear vs dynamic ad model || 1) - Linear – matches TV ad load &amp;lt;br&amp;gt; 2) Dynamic – Dynamic Ad Insertion (DAI) || yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSDK DTVR Step 5 - SDK DTVR Event Sequence ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv700&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 5 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv700&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The sample event lifecycle can be used as a reference for identifying the order for calling events. Make BSDK API call ggPM() for metadata with first param as loadmetadata and second param as metadata, while for sending ID3 tag pass sendID3 as first param and ID3 payload as second param. Add the following code after creating your DTVR metadata object(s) from the previous step:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;loadMetadata&amp;quot;, contentMetadataObject); &lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;sendID3&amp;quot;, ID3_Payload); // call sendID3 every 10 seconds and stop calling during any playback interruptions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====SDK Event Parameters =====&lt;br /&gt;
&lt;br /&gt;
The events listed below are available for integration of the DTVR. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !! Parameter !! Description &lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;loadMetadata&amp;quot; || content/Ad metadata object || Needs to be called at the beginning of each asset to pass type and adModel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;sendID3&amp;quot; || Used to send the ID3 tag payload retrieved from the stream || Needs to be called at the beginning of playback&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;setVolume&amp;quot; || Used to pass in the player volume levels in % || Needs to be called when the player volume changes. '''This is applicable only for Audibility feature.'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====ID3 Tags =====&lt;br /&gt;
ID3_Payload is the container to pass the retrieved ID3 tag from the stream. The player should look for 'PRIV' ID3 tags and send 'owner' field (which typically starts from &amp;quot;www.nielsen.com&amp;quot;) through this API. Refer to DTVR Event Listeners section below for more information.&lt;br /&gt;
&lt;br /&gt;
'''Sample ID3 Tags'''&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&lt;br /&gt;
&lt;br /&gt;
www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSDK DTVR Step 6 - DTVR Event Listeners ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv800&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt; Show/hide step 6 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv800&amp;quot;&amp;gt;&lt;br /&gt;
====Event Listeners====&lt;br /&gt;
In the prior section, we went over the SDK event sequence required for DTVR measurement. If the stream contains ads then you '''must''' use the '''loadMetadata''' API call to indicate the type of ads (linear or dynamic) at the beginning of the stream/when the player starts to play.&lt;br /&gt;
The method for ID3 extraction is going to be dependent on the video player that it used. It must have methods that allow for ID3 extraction so the client can supply them to the Browser SDK based on the HLS standard. When reading the payload metadata from the stream you'll want to look for &amp;quot;www.nielsen.com&amp;quot; which will indicate the start of the ID3 tag.&lt;br /&gt;
&lt;br /&gt;
Refer to [[Retrieving_ID3_Tags|retrieve id3 tag]] for more information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSDK DTVR Step 7 - Keep Going ====&lt;br /&gt;
&amp;lt;span class=&amp;quot;mw-customtoggle-myDivisionv900&amp;quot; style=&amp;quot;color: cornflowerblue&amp;quot;&amp;gt;Show/hide step 7 &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-myDivisionv900&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Keep Going====&lt;br /&gt;
&lt;br /&gt;
Congratulations, your video player should have Browser SDK integration with DTVR measurement.&lt;br /&gt;
&lt;br /&gt;
'''Next Steps'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Now that you've integrated the BSDK, what's next?&lt;br /&gt;
&lt;br /&gt;
'''Going Live'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Once the DTVR Tracking Code is added, 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;
&lt;br /&gt;
&lt;br /&gt;
App ID: Ensure that correct  is used during initialization&lt;br /&gt;
'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Debug Logging: Disable logging by deleting {nol_sdkDebug: 'debug'} from initialization call.&lt;br /&gt;
&lt;br /&gt;
PRODUCTION Initialization Call - Refer to the production initialization call below:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { optout: &amp;quot;false&amp;quot; });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=PCM-to-ID3_Certified_Vendors&amp;diff=6585</id>
		<title>PCM-to-ID3 Certified Vendors</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=PCM-to-ID3_Certified_Vendors&amp;diff=6585"/>
		<updated>2024-03-27T02:47:50Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|TV}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:TV]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PCM to ID3 Certifed Vendors'''&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! OEM Vendor !! Product !! Latest Product Version !! SDK Version !! .ts !! Legacy HLS !! Legacy DASH !! CMAF / fMP4 HLS !! CMAF / fMP4 Dash&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''Anvato''' || '''Anvato Media'''|| '''1354''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Ateme''' || '''TITAN File'''|| '''2.16, 2.18, 2.4.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (06-11-2021)|2.3.2]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Ateme''' || '''TITAN Live'''|| '''4.1''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (06-11-2021)|2.3.2]] || ''' ''' || '''✔'''|| '''✔''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''BamTech''' || '''xcoder'''|| '''111''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''BitMovin''' || '''(s/n of device)'''|| '''2.4.8''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || ''' '''|| ''' ''' || '''✔''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Deluxe''' || '''One'''|| '''v1''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| '''✔''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''DisneyStreaming (BamTech)''' || '''xcoder'''|| '''3.0, 4.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Elemental''' || '''Elemental Live'''|| '''2.18, 2.18.3, 2.23.3, 2.24.3, 2.25.3, 2.26.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016) (08-23-2021) |2.3.2]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Elemental''' || '''Elemental MediaLive'''|| '''2.15.6''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || '''✔''' || ''' '''|| ''' ''' || '''✔''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Elemental''' || '''Elemental Server'''|| '''2.16.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Elemental''' || '''Elemental Server'''|| '''2.17.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (08-23-2021)|2.3.2]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Elemental''' || '''Elementa'''|| '''2.19''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (08-23-2021)|2.3.2]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Encoding.com''' || ''' encoding.com '''|| '''1.5''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''Electra XT'''|| '''2.9''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2 ''(TRP only)'']] || '''✔ .trp''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''proMedia'''|| '''2399''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''VOS'''|| '''1.10''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || ''' '''|| ''' ''' || '''✔''' || '''✔'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''VOS 360 Software'''|| '''1.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || ''' '''|| ''' ''' || '''✔''' || '''✔'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''XOS'''|| '''1.19''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Imagine Comms''' || '''SelenioNext'''|| '''1.3''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''iStreamPlanet''' || '''Aventus'''|| '''M2i4''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''iStreamPlanet''' || '''Aventus'''|| '''10''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || '''✔''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Inca Networks''' || '''4400 &amp;amp; 3840'''|| '''1.0.51''' ||  [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2 ''(TS only)'']] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Inca Networks''' || '''BlueLine'''|| '''1.0.5''' ||  [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2 ''(TS only)'']] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''MediaExcel''' || '''Hero'''|| '''4.0.6''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind (Ericsson)''' || '''MediaFirst Encoding Live'''|| '''10''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| '''✔''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind (Ericsson)''' || '''Packager'''|| '''12''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || ''' '''|| ''' ''' || '''✔''' || '''✔'''&lt;br /&gt;
|-&lt;br /&gt;
| '''NeuLion''' || '''NeuEncoder'''|| '''4.8''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Quickplay''' || '''2'''|| '''1.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Synamedia (Cisco)''' || '''Anyres Live'''|| '''7.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Synamedia (Cisco)''' || '''Powervue'''|| '''0629''' || [[ID3 SDK Release Notes#ID3 SDK v1.0.0 (04-01-2015)|1.0.0]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Synamedia (Cisco)''' || '''vDCM'''|| '''9.0''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Syncbak''' || '''Syncbox'''|| '''0201''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Telestream''' || '''Vantage'''|| '''6.3''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.0 (05-01-2015)|2.3.0]] || '''✔''' || ''' '''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Verizon Digital Media Services (VDMS) Edgio''' || '''Uplynk Slicer'''|| '''2203, 2204, 2206, 2207, 2208, 2210, 2212 ''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
| '''Verizon Digital Media Services (VDMS) Edgio''' || '''Uplynk Slicer'''|| '''2301, 2302, 2303 (March), 2303 (April), 2304, 2306, 2309, 2311''' || [[ID3 SDK Release Notes#ID3 SDK v2.3.2 (07-20-2016)|2.3.2]] || ''' ''' || '''✔'''|| ''' ''' || ''' ''' || ''' '''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''ID3 Tag Validator'''&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! OEM Vendor !! Product !! Latest Product Version !! ID3 Validator&lt;br /&gt;
|-&lt;br /&gt;
| '''Vela''' || '''Encompass'''|| '''130'''  || [[ID3 SDK Release Notes#ID3 Tag Validator SDK v1.8 (10-24-2017)|1.8]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mediaproxy''' || '''LogServer'''|| '''10.1'''  || [[ID3 SDK Release Notes#ID3 Tag Validator SDK v1.8 (10-24-2017)|1.8]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Encoder_Certified_Vendors&amp;diff=6584</id>
		<title>Nielsen Encoder Certified Vendors</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Nielsen_Encoder_Certified_Vendors&amp;diff=6584"/>
		<updated>2024-03-27T02:47:21Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|TV}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:TV]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
&amp;lt;!--  --&amp;gt;&lt;br /&gt;
(Linear WM SDK v5.3.4 and v6.0.17 – TV CBET v2 Compliant)&lt;br /&gt;
|-&lt;br /&gt;
! OEM Vendor !! Product !! Product Version !! Numeris Capable !! Numeris Certified !! Linear WM !! VOD in TV Ratings Flag !! VOD Content Ratings !! Commercial&lt;br /&gt;
|-&lt;br /&gt;
| '''Ateme''' || '''TITAN Live'''|| '''4.1''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Amagi''' || '''Cloudport'''|| '''4.x''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''Live''' || '''2.11''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''Live''' || '''2.21.2.0''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''MediaConvert''' || '''1.0''' ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.2.1 (05-08-2020)|5.2.1]] ||&lt;br /&gt;
|-&lt;br /&gt;
| '''AWS Elemental''' || '''MediaLive''' || '''2.18''' ||'''✔'''|| '''In Process''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (10-26-2021)|5.3.4]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''BCNEXXT''' || '''VIPE''' || '''22.10''' ||'''✔'''|| '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''Cinegy''' || '''Cinegy Air''' || '''11.3''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Clearleap/IBM''' || '''Clearflow''' || '''7.6''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Clearleap/IBM''' || '''Video Logistics Manager''' || '''27''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.0.23 (11-04-2019)|5.0.23]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''coralbay.tv''' || '''coralPlay''' || '''1''' ||'''✔'''|| ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''Dalet''' || '''Amberfin''' || '''11.5.3.0''' ||  ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] &lt;br /&gt;
|-&lt;br /&gt;
| '''encoding.com''' || '''SaaS Cloud Media''' || '''n/a''' ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Evertz''' || '''OvertureRT RenderX''' || '''2.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] || [[Watermark SDK Release Notes#Watermark SDK v4.1.1 (05-19-2017)|4.1.1]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Grass Valley''' || '''AMPP Microservices''' || '''S/W v6 (Windows)''' || ''' ''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Grass Valley''' || '''AMPP Microservices''' || '''GV Engine v3.3 (Windows)''' || ''' ''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Grass Valley''' || '''AMPP Microservices''' || '''GV Engine v3.3 (Linux)''' || ''' ''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  ||   &lt;br /&gt;
|- &lt;br /&gt;
| '''Grass Valley (Snell)''' || '''ICE''' || '''8.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|- &lt;br /&gt;
| '''Grass Valley''' || '''Miranda iTX OS2''' || '''3.212.0.190''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''Rhozet Carbon Coder''' || '''3.3''' ||  ||  ||  ||  ||   || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]]&lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''Electra X''' || '''1.4''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''VOS''' || '''1.5''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''VOS''' || '''1.6''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4 &amp;amp; 6.0.1 (immersive)]] ||  [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Harmonic''' || '''XOS''' || '''1.6''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4 &amp;amp; 6.0.1 (immersive)]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Hybrik''' || '''Cloud Media Processing''' || '''1.1''' ||  ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] || &lt;br /&gt;
|-&lt;br /&gt;
| '''Igolgi Inc.''' || '''iLux Broadcast ATSC 1.0''' || '''2.5''' || '''✔''' || ''' ''' || [[Watermark SDK Release Notes#Watermark SDK v6.0.17 (12-20-2022)|6.0.17]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Imagine Communications''' || '''Aviator Windows AWS and On Premise''' || '''4.8''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (09-26-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Imagine Communications''' || '''Versio Platform''' || '''4.5''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Inetsat''' || '''Video Server''' || '''3''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Linear Acoustic''' || '''Aero''' || '''.100, .2000, .8000''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Linear Acoustic''' || '''LA-5300''' || '''Broadcast Audio Processor''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''Aquila''' || '''5''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''Aquila''' || '''6''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''Aquila''' || '''7''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| '''Mediakind''' || '''MediaKind Encoding Live''' || '''12''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Multiplex Cloud''' || '''NEO''' || '''Ethernet Encoder Module''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Multiplex Cloud''' || '''NEO''' || '''2.10.31''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Dolphin''' || '''1.19''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.1.0.2''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.2.0.6''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.3.0.4''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.3.0.1010''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.4.0''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Pebble Beach''' || '''Integrated Channel''' || '''2.5.0''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (12-16-2022)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''PixelPower''' || '''StreamMaster DELIVER''' || '''2''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (09-22-2021)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''PixelTools''' || '''MPEGRepair HD''' || '''7.2''' ||  ||  ||   ||  || || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] &lt;br /&gt;
|-&lt;br /&gt;
| '''PixelTools''' || '''MPEGRepair HD''' || '''9.1''' ||  ||  ||   ||  || || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (11-30-2022)|6.0.13]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Ross''' || '''BAP''' || '''1.1.1''' || '''✔''' ||'''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Ross''' || '''NWE-IP''' || '''1.4.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Stingray Digital Group''' || '''Ubiquicast''' || '''4.0''' || '''✔''' || '''✔''' || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''Synamedia''' || '''vDCM''' || '''20''' || '''✔''' ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.4 (05-23-2019)|5.3.4]] ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| '''Syncbak''' || '''Syncbox''' || '''1.0''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v4.2.1 (08-16-2017)|4.2.1]] ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| '''Telestream''' || '''Vantage''' || '''7.0''' ||  ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]]  || [[Watermark SDK Release Notes#Watermark SDK v3.8.3 (08-01-2015)|3.8.3]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telestream''' || '''Vantage''' || '''8.1''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.23 (06-24-22)|5.3.23]] ||[[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]]  || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Telestream''' || '''Transform''' || '''2021-09-001''' ||  ||  || [[Watermark SDK Release Notes#Watermark SDK v5.3.23 (07-27-22)|5.3.23]] ||[[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (12-15-22)|6.0.13]]  || [[Watermark SDK Release Notes#Watermark SDK v6.0.13 (07-20-22)|6.0.13]] &lt;br /&gt;
|-&lt;br /&gt;
| '''Vubiquity''' ||  ||  ||  ||  ||  || [[Watermark SDK Release Notes#VOD in TV Ratings Application v1.0.2.1|App v1.0.2.1]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=TV&amp;diff=6583</id>
		<title>TV</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=TV&amp;diff=6583"/>
		<updated>2024-03-27T02:46:39Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TV]]&lt;br /&gt;
{{Banner|Encoder Support}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 {{Alert|'''Download:''' '''https://nielsendownloads.digitalengsdk.com/tv/REMINDER_Spring_2019_DST.pdf Reminder: Daylight Savings Time (DST) changes November 3]''' &amp;lt;br&amp;gt; '''See also:''' '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Quick_Reference_Guide_Spring_2019_DST.pdf Daylight Savings Time Quick Reference Guide Spring 2019]''' }}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--  --&amp;gt;&lt;br /&gt;
{{Alert|&lt;br /&gt;
'''Nielsen Encoder Installation and Configuration Policy 2022 Now Available:'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''Official release notification:  [https://nielsendownloads.digitalengsdk.com/tv/Encoding/Encoder+Policy+2022+-+04-01-22.pdf Nielsen Encoder Installation and Configuration Policy 2022]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px;&amp;quot; |&lt;br /&gt;
! Certified Vendors&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | &lt;br /&gt;
| '''[[Nielsen Encoder Certified Vendors]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | &lt;br /&gt;
| '''[[Nielsen Decoder Certified Vendors]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | &lt;br /&gt;
| '''[[PCM-to-ID3 Certified Vendors]]'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px;&amp;quot; |&lt;br /&gt;
! Reference &amp;amp; Policy Supplements&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads.digitalengsdk.com/tv/Encoding/Encoder+Policy+2022+-+04-01-22.pdf Nielsen Encoder Installation and Configuration Policy 2022]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/Internet_Distribution_Policy_Rev_A.pdf Internet Distribution Policy]'''&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads.digitalengsdk.com/tv/Encoding/Nielsen+Encoder+Solutions+2023.pdf Nielsen Encoder Solutions 2023]'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads.digitalengsdk.com/tv/Encoding/Nielsen+Encoder+Solutions+2024.pdf Nielsen Encoder Solutions 2024]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/MVPD%20provided%20Direct%20Feeds%20with%20Unique%20Commercial%20Content.pdf MVPD provided Direct Feeds with Unique Commercial Content]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoder%20Alert%20Distribution%20List%20Instructions_Final.pdf Nielsen Encoder Alert Distribution List - Instructions]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryIcon|EncodingIcon.png|TV Audio Encoding}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 35%;&amp;quot; | Software&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS &lt;br /&gt;
! Download&lt;br /&gt;
|-&lt;br /&gt;
| {{SmallIcon|CircuitIcon.png}}&lt;br /&gt;
| '''[[NWE-3GA]]''' || {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-3GA Software package Rev 2.5.0.0 |dlid= 5a3f0ecbef6bfe4c9339fb8346a0064a645ebebf}} &amp;lt;small&amp;gt;''('''New!''')''&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|-&lt;br /&gt;
| {{SmallIcon|CircuitIcon.png}}&lt;br /&gt;
| '''[[NWE-3GA]]''' || {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-3GA NWE-3G Software package Rev 2.3.0.9 |dlid=73aeefb5972bb1f556aa5093c14b981d223bec8e}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|RackIcon.png}}&lt;br /&gt;
| '''[[NWE-TS]]'''&lt;br /&gt;
|| {{OSIcon|FirmwareIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-TS Firmware 4.6.10|dlid=31e04631784a2438fc41c81f34a49c33cd513ec6}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-TS Firmware 4.5.1|dlid=5126ebc2699eda28002ba6e2e84fb8a1031827f5}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|RackIcon.png}}&lt;br /&gt;
| '''[[Multi-Channel Encoder]]'''&lt;br /&gt;
|| {{OSIcon|FirmwareIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| Multi-Channel Encoder v1.2.4]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|VODIcon.png}}&lt;br /&gt;
| '''[[VOD Content Encoder]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| VOD Content Encoder]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|VODIcon.png}}&lt;br /&gt;
| '''[[VOD in TV Ratings]]'''  ''&amp;lt;small&amp;gt;(formerly RTVOD)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| VOD in TV Ratings]] ''&amp;lt;small&amp;gt;(formerly RTVOD)&amp;lt;/small&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|ComputerWaveIcon.png}}&lt;br /&gt;
| '''[[SpoTTrac®]]'''&lt;br /&gt;
|| {{OSIcon|FirmwareIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| SpoTTrac Firmware]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|EncoderGrayIcon.png}}&lt;br /&gt;
| '''[[NAVE II]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*NAVE II Firmware v38&lt;br /&gt;
*NAVE II Manager&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|EncoderGrayIcon.png}}&lt;br /&gt;
| '''[[NAVE IIC]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*NAVE IIC Firmware v3.4.15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryIcon|ID3Icon.png|ID3 Transcoding}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 35%;&amp;quot; | Software&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS &lt;br /&gt;
! Download &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|ID3XcodeIcon.png}}&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[ID3 Transcoders]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, Software Updates, and Test Streams)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Windows) v2.3.2|dlid=ac5b0e72a84b1a6e86da1a8fe0a89e24083468eb}}&lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Windows Visual Studio 2013) v2.3|dlid=533cee44e69c6859e56acd9cbb38334d6b215c00}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Linux x64 GLIBC 2.12) v2.3.2|dlid=c499535f6ce9a0326a408b167079e01a0596e141}}&lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Linux x64 GLIBC 2.17) v2.3.2|dlid=b353e404994a1d26726b196960efe40c30427571}}&lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Linux x86 GLIBC 2.17) v2.3.2|dlid=f82dfbde6f5f68ccf677b63e32fc83e68fa82cd6}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|macOSIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (MacOS) v2.3|dlid=3a9d04be165f39ac956278c8292cd1b87ce34b62}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;1&amp;quot;| {{SmallIcon|ID3DashIcon.png}}&lt;br /&gt;
|rowspan=&amp;quot;1&amp;quot;| '''[[ID3 in MPEG-DASH]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, and Sample Audio Files)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|StaticIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/ID3%20Transcoding/ID3%20in%20MPEG-DASH/bbb-MPEG-DASH.zip Big Buck Bunny MPEG-DASH Nielsen Tagged]&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/ID3%20Transcoding/ID3%20in%20MPEG-DASH/nielsenconsumer-MPEG-DASH.zip Nielsen Consumer MPEG-DASH Nielsen Tagged]&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/ID3%20Transcoding/ID3%20in%20MPEG-DASH/nielsenxplatform-MPEG-DASH.zip Nielsen Cross Platform MPEG-DASH Nielsen Tagged]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|ID3ValidateIcon.png}} &lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[PCM-to-ID3 Validator]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, and Downloads)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator (Windows) v1.8|dlid=67d34c64d1ed349c1ad92ac47adf62c877f47fcb}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator (CentOS) v1.7|dlid=dd6b62c76995aa7e1702c60e02076348ceaf573b}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|macOSIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator (MacOS) v1.7|dlid=3afc5a7ec29593e2eb47daa9746b6d16cbd785e1}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|ID3ValidateIcon.png}} &lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[PCM-to-ID3 Validator SDK]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, and Downloads)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator SDK (Windows) v1.8|dlid=78a936556ebc5caf57d2fc4d09de3a272ace9fea}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator SDK (CentOS) v1.7|dlid=ccb9af4ef45cfcf7aa4406ca63ab3b7c6efdad11}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|macOSIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator SDK (MacOS) v1.7|dlid=05e99551d28ef4a65eab6168ad2872648346aab2}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryIcon|DiagnosisToolsIcon.png|Diagnostic Tools}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 35%;&amp;quot; | Software&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS &lt;br /&gt;
! Download &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|NACATIcon.png}} &lt;br /&gt;
|| &amp;lt;!-- '''[[Nielsen Audio Code Analysis Tool 3|Nielsen Audio Code Analysis Tool 3 (NACAT3)]]''' --&amp;gt;&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NACAT3 3.0.0.1|dlid=ce2cba3d4b4231a0978c632028c1a45479a8184d}} &amp;lt;small&amp;gt;''('''New!''')''&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| {{SmallIcon|NACATIcon.png}} &lt;br /&gt;
|| '''[[Nielsen Audio Code Analysis Tool 2|Nielsen Audio Code Analysis Tool 2 (NACAT2)]]''' &lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NACAT2 1.4|dlid=83d58832e663a21841b32f771cc2781ae5b5b572}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|NACATIcon.png}} &lt;br /&gt;
|| '''[[Nielsen Audio Code Analysis Tool|Nielsen Audio Code Analysis Tool (NACAT)]]''' &lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NACAT installer (Windows) v4.3|dlid=212d5eb338cf66cd20f3846347bc3c8c6b2dfbc4}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|NDICEIcon.png}}&lt;br /&gt;
|| '''[[Nielsen Digital Code Extractor]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Nielsen Digital Code Extractor Installer|dlid=c0eb8eb1802bd08956f6e215473ef1881274a6df}} &amp;lt;BR&amp;gt; (See special installation instructions in [[Nielsen Digital Code Extractor|guide]])&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|SDKIcon.png}} &lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[Decoder SDK Monitor]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Decoder SDK Monitor (Windows vs2017) v1.4|dlid=b3ae411765cfa2b878c3f50c0824e61d81a58fbb}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Decoder SDK Monitor (Windows vs2015) v1.4|dlid=68d1fd697862e663a7aa2efc46377f053c983a5a}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Decoder SDK Monitor (CentOS) v1.4|dlid=c978921ba90736bf7f2c82287a0a97af89109bec}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|NDICEIcon.png}}&lt;br /&gt;
|| '''[[Nielsen Monitor Application]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Nielsen Monitor Application (Windows) v1.4|dlid=6ddf77a8f67dff67b4cbad1fee630ee80318b5bf}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Radio&amp;diff=6582</id>
		<title>Radio</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Radio&amp;diff=6582"/>
		<updated>2024-03-25T19:07:47Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Banner|Nielsen Audio Support|Radio}}&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
{{Alert| '''Product Notification:'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''MCEM FIRMWARE 1.5.2.07 NOW AVAILABLE''''' &amp;lt;br&amp;gt;&lt;br /&gt;
'''''Official release notification:   [https://nielsendownloads-blue.digitalengsdk.com/radio/Multi-Channel+Encoding+Monitor/Information+Bulletin+206.pdf    INFORMATION BULLETIN 206 - RELEASE OF MCEM FIRMWARE 1.5.2.07 ]'''''}}&lt;br /&gt;
&lt;br /&gt;
=== Multi-Channel Encoding Monitor ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 375px;&amp;quot; | Description&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; | File &lt;br /&gt;
! Download &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''MCEM - Product Overview'''&lt;br /&gt;
|| {{SmallIcon|PDFIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/Multi-Channel%20Encoding%20Monitor/Product%20Overview%20-%20Multi-Channel%20Encoding%20Monitor.pdf MCEM - Product Overview]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''MCEM - Quick Reference Guide'''&lt;br /&gt;
|| {{SmallIcon|PDFIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/Multi-Channel%20Encoding%20Monitor/MCEM-Quick%20Reference%20Guide.pdf MCEM - Quick Reference Guide]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''MCEM - Instructions for Confirming Connectivity'''&lt;br /&gt;
|| {{SmallIcon|PDFIcon.png}} || &lt;br /&gt;
*[https://engineeringportal.nielsen.com/w/docs/MCEM-Instructions_for_Confirming_Connectivity.pdf MCEM - Instructions for Confirming Connectivity]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''MCEM 1.5.2.07 Firmware Download and Instructions'''&lt;br /&gt;
|| {{SmallIcon|ZipIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/Multi-Channel+Encoding+Monitor/MCEM+1_5_2_07+Firmware+Instructions+Manual+2022+March+2.zip MCEM 1.5.2.07 Firmware Manual Instructions 2022 March]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''MCEM - Activating Email Alerting'''&lt;br /&gt;
|| {{SmallIcon|PDFIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/Multi-Channel+Encoding+Monitor/Activating%20Email%20Alerting%20on%20the%20MCEM.pdf MCEM - Activating Email Alerting]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''MCEM - Data and Analytics'''&lt;br /&gt;
|| {{SmallIcon|PDFIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/Multi-Channel%20Encoding%20Monitor/Multi-Channel%20Encoding%20Monitor%20Data%20and%20Analytics.pdf MCEM - Data and Analytics]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''MCEM - User Manual'''&lt;br /&gt;
|| {{SmallIcon|PDFIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/Multi-Channel%20Encoding%20Monitor/MCEM%20Equipment%20Manual%20S%20Revision%20M%20.pdf MCEM - User Manual]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''MCEM - Encodability and Detectability'''&lt;br /&gt;
|| {{SmallIcon|PDFIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/Multi-Channel%20Encoding%20Monitor/MCEM%20-%20Encodability%20View%20and%20Detectability%20Confidence%20History%20-%20How%20to%20Access%20CSV%20Files.pdf MCEM - Encodability View and Detectability Confidence History]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''MCEM Order Form'''&lt;br /&gt;
|| {{SmallIcon|SheetIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/Multi-Channel%20Encoding%20Monitor/MCEM%20Order%20Form%20e1.xlsx MCEM Order Form]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Diagnostic Tools===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 375px;&amp;quot; | Description&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; | File &lt;br /&gt;
! Download &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Nielsen Audio Code Analysis Tool 2|Nielsen Audio Code Analysis Tool 2 (NACAT2)]]''' &lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NACAT2 1.4|dlid=83d58832e663a21841b32f771cc2781ae5b5b572&amp;amp;section=r}}&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|| '''[[Nielsen Audio Code Analysis Tool 3|Nielsen Audio Code Analysis Tool 3 (NACAT3)]]''' &lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for NACAT3® Product Overview, and Software Updates)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NACAT3 3.0.0.1|dlid=4cbdb82cd444407a755ad64428e4f96f9b37d05c&amp;amp;section=r}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Nielsen Audio Software Encoder ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 375px;&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| The Nielsen Audio Software Encoder is available for integration into 3rd party broadcasting equipment. More information can be found [[Nielsen_Audio_Software_Encoder|here]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AnaDig 1212 Encoder ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 375px;&amp;quot; | Description&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; | File &lt;br /&gt;
! Download &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''PPM Encoding Best Practices'''&lt;br /&gt;
|| {{SmallIcon|PDFIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/AnaDig%201212%20Encoder/PPM%20Encoding%20Best%20Practices.pdf PPM Encoding Best Practices]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''AnaDig 1000-1212 Encoder Equipment Manual'''&lt;br /&gt;
|| {{SmallIcon|PDFIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/AnaDig%201212%20Encoder/Equipment%20Manual,%20AnaDig%20Encoder%20(1050-1645%20RevE).pdf Equipment Manual, AnaDig Encoder (1050-1645 RevE)]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''Firmware AnaDig1212 Encoder v1.0.3.1'''&lt;br /&gt;
|| {{SmallIcon|ZipIcon.png}} || &lt;br /&gt;
* [https://nielsendownloads-blue.digitalengsdk.com/radio/AnaDig%201212%20Encoder/Firmware_AnaDig1212__Encoder_Version_1.0.3.1%20(1096-1284_Rev_A).zip Firmware_AnaDig1212__Encoder_Version_1.0.3.1 (1096-1284_Rev_A)]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Digital (AES) Encoder ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 375px;&amp;quot; | Description&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; | File &lt;br /&gt;
! Download &lt;br /&gt;
|-&lt;br /&gt;
| '''Digital (AES) Encoder Equipment Manual (1050-1475 RevF)'''&lt;br /&gt;
|| {{SmallIcon|PDFIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/Digital%20(AES)%20Encoder/Digital%20(AES)%20Encoder%20Equipment%20Manual%20(1050-1475%20RevF).pdf Digital (AES) Encoder Equipment Manual (1050-1475 RevF)]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Analog Encoder ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 375px;&amp;quot; | Description&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; | File &lt;br /&gt;
! Download &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''Analog Encoder Equipment Manual (1050-1473 RevF)'''&lt;br /&gt;
|| {{SmallIcon|PDFIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/radio/Analog%20Encoder/Analog%20Encoder%20Equipment%20Manual%20(1050-1473%20RevF).pdf Analog Encoder Equipment Manual (1050-1473 RevF)]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!International Radio/Audio Documentation&lt;br /&gt;
|-&lt;br /&gt;
| '''[[International_Audio|International Audio]]'''&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=International_DCR&amp;diff=6581</id>
		<title>International DCR</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=International_DCR&amp;diff=6581"/>
		<updated>2024-02-06T18:26:50Z</updated>

		<summary type="html">&lt;p&gt;Mywikis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
{{CategoryIcon|International.png|International DCR}}&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Please contact your Nielsen representative for documentation if the guides for your country aren't listed.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Downloads&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 90px;&amp;quot; |{{SmallIcon|DownloadIcon.png|alt=Cloud API}} &lt;br /&gt;
|style=&amp;quot;width: 90px;&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| '''[[Digital Downloads|SDK Downloads]]'''&lt;br /&gt;
| '''SDK Release Notes: [[Browser_SDK_Release_Notes|BSDK]], [[Android_SDK_Release_Notes|Android]], [[iOS_SDK_Release_Notes|iOS]], [[TVOS_SDK_Release_Notes|TVOS]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | International Audio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 90px;&amp;quot; | {{SmallIcon|AudioIcon.png}}&lt;br /&gt;
| style=&amp;quot;width: 45px;&amp;quot; | {{SmallIcon|DownloadIcon.png|alt=Cloud API}} &lt;br /&gt;
| '''[[International_Audio|International Digital Radio]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Australia&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|AUFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR Australia Video iOS SDK|Request DCR Australia Video iOS SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Australia Video Android SDK|Request DCR Australia Video Android SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Australia Video Browser SDK|Request DCR Australia Video Browser SDK]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Czech&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | {{SmallIcon|CZFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Czech Video App SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Czech Video Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{OSIcon|StaticIcon.png}}&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Czech Static Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |&lt;br /&gt;
| '''[[Czech SDK Metadata]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Czech Changing Approved Player]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Czech Contacts]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Denmark&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
!| Links&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | {{SmallIcon|DKFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR Denmark Video iOS SDK]]'''&lt;br /&gt;
| [https://engineeringportal.nielsen.com/docs/Special:ClickThrough?region=DK Sign License Agreement]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Denmark Video Android SDK]]'''&lt;br /&gt;
| [https://engineeringportal.nielsen.com/docs/Special:ClickThrough?region=DK Sign License Agreement]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Denmark Video Browser SDK]]'''&lt;br /&gt;
| [https://engineeringportal.nielsen.com/docs/Special:ClickThrough?region=DK Sign License Agreement]&lt;br /&gt;
|-&lt;br /&gt;
| {{SmallIcon|CloudAPIIcon.png}}&lt;br /&gt;
| {{OSIcon|APIIcon.png}}&lt;br /&gt;
| '''[[DCR Denmark Video Cloud API]]'''&lt;br /&gt;
| [https://engineeringportal.nielsen.com/docs/Special:ClickThrough?region=DK Sign License Agreement]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Germany&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 90px;&amp;quot; |{{SmallIcon|DEFlagIcon.png}} &lt;br /&gt;
|style=&amp;quot;width: 90px;&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| '''[[AGF Implementation Documentation]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Ireland&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
!| Links&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|IEflagicon.png}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR Ireland Video iOS SDK]]'''&lt;br /&gt;
| [https://engineeringportal.nielsen.com/IRL/ Download IRL iOS SDK]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Ireland Video Android SDK]]'''&lt;br /&gt;
| [https://engineeringportal.nielsen.com/IRL/ Download IRL Android SDK]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Ireland Video Browser SDK]]'''&lt;br /&gt;
| [https://engineeringportal.nielsen.com/IRL/ Download IRL Browser SDK]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Italy&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | {{SmallIcon|ITFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
|{{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR Italy Video iOS SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|{{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Italy Video Android SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Italy Video Browser SDK (6.0.0)]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | {{OSIcon|StaticIcon.png}}&lt;br /&gt;
|{{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR Italy Static iOS SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|{{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Italy Static Android SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Italy Static Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|FacebookIcon.png|alt=Facebook Instant Articles}}&lt;br /&gt;
| '''[[DCR Italy Static Facebook Instant Articles Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|AMPIcon.png|alt=Google AMP}}&lt;br /&gt;
| '''[[DCR Italy Static Google AMP Cloud API]]'''&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | KSA&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|Saudi Arabia.png}}  &lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR KSA Video iOS SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR KSA Video Android SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR KSA Video Browser SDK]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Norway&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|norway-flag-xs.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR Norway Audio ios App SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Norway Audio Android App SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Norway Audio Browser SDK]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Poland&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|PLFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR Poland Video iOS SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Poland Video Android SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Poland Video Browser SDK]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | India&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|INFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR India Video iOS SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR India Video Android SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR India Video Browser SDK]]'''&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Sweden&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
!| Links&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | {{SmallIcon|SWflagicon.png}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR Sweden Video iOS SDK]]'''&lt;br /&gt;
| [https://engineeringportal.nielsen.com/docs/Special:ClickThrough?region=SE Sign License Agreement]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Sweden Video Android SDK]]'''&lt;br /&gt;
| [https://engineeringportal.nielsen.com/docs/Special:ClickThrough?region=SE Sign License Agreement]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Sweden Video Browser SDK]]'''&lt;br /&gt;
| [https://engineeringportal.nielsen.com/docs/Special:ClickThrough?region=SE Sign License Agreement]&lt;br /&gt;
|-&lt;br /&gt;
| {{SmallIcon|CloudAPIIcon.png}}&lt;br /&gt;
| {{OSIcon|APIIcon.png}}&lt;br /&gt;
| '''[[DCR Sweden Video Cloud API]]'''&lt;br /&gt;
| [https://engineeringportal.nielsen.com/docs/Special:ClickThrough?region=SE Sign License Agreement]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Taiwan&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|TWFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR Taiwan Video iOS SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Taiwan Video Android SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Taiwan Video Browser SDK]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Thailand&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|THFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR Thailand Video iOS SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Thailand Video Android SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Thailand Video Browser SDK]]'''&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mywikis</name></author>
	</entry>
</feed>