DCR Pre-Certification Checklist: Difference between revisions
From Engineering Client Portal
(Created page with "{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR & DTVR}} {{CurrentBreadcrumb}} Category:Digital") |
NickParrucci (talk | contribs) No edit summary |
||
(9 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR & DTVR}} {{CurrentBreadcrumb}} | {{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR & DTVR}} {{CurrentBreadcrumb}} | ||
[[Category:Digital]] | [[Category:Digital]] | ||
== App Pre-Certification Checklist == | |||
The purpose of this document is to provide instruction on determining if your implementation of Digital Content Ratings (DCR) via App is ready to be submitted for certification. This document provides you the ability understand what is expected after implementation and before submitting to Nielsen. After all checks in this document are completed and passed, your Digital Implementation Manager (DIM) will further assess the implementation’s readiness for certification. | |||
=== Before You Start === | |||
{| class="wikitable" | |||
|- | |||
! style="width: 30px;" | | |||
! Item | |||
|- | |||
| ☐ || For testing, your AppID should start with a "'''P'''" and your sfcode should be set to "'''dcr-cert'''". | |||
|- | |||
| ☐ || The opt-out/opt-in functionality has been implemented within your App. | |||
|- | |||
| ☐ || Ensure the AppSDK initializes and the API events are enabled for DCR. | |||
|- | |||
| ☐ || Ensure stop API for all scenarios where the video could be interrupted (e.g., alerts, alarm, calendar, incoming calls, killing the app, channel change, stop/pause, background/foreground, etc.). | |||
|- | |||
| ☐ || Once playback resumes from any interruption scenario, the app should call loadMetadata and playheadPosition APIs (iOS:playheadPosition | Android:setPlayheadPosition). | |||
|- | |||
| ☐ || Record the Device Identifier of your test device for your Digital Implementation Manager. See [[DCR_Pre-Certification_Checklist#Obtaining Your Device Identifier]]. | |||
|- | |||
| ☐ || Ensure that all content is consistently available and CMS enabled. Any interruptions or intermittence in the flow will cause delays in the testing process for all parties involved. | |||
|} | |||
==== Monitoring Tools ==== | |||
You will need an HTTP traffic-monitoring tool, such as Charles or Fiddler. | |||
* '''Charles:''' http://www.charlesproxy.com/ | |||
* '''Fiddler:''' http://www.telerik.com/fiddler | |||
=== Testing Your App Implementation === | |||
===== Capture Traffic ===== | |||
To capture traffic from the SDK, filter HTTP traffic with the string "imr", as seen in Figure 1. This will capture traffic going to Nielsen servers. You will then need to set up your device to proxy to this traffic analyzer. Instructions may vary from device to device and are available online. | |||
*'''Charles:''' View → Focused Hosts | |||
[[File:FocusedHostsScreenshot.png|link=]] | |||
*'''Fiddler:''' Filters (tab) | |||
[[File:fiddlerScreenshot.png|link=]] | |||
===== Ensure opt-in ===== | |||
If you previously tested the opt-out function or app disable feature, make sure that an opt-in was completed on your device before continuing. Terminate your app completely before starting. | |||
===== "Hello" Ping ===== | |||
The first HTTPS traffic you should see is the SDK request for configuration information, called a "'''hello ping'''". An example has been included below. In order to see this ping, Charles/Fiddler has to be configured to capture HTTPS traffic. This ping will be cached in memory, so it will be seen only on the first launch of the app or when metadata changes. | |||
<code><nowiki>https://secure-dcr-cert.imrworldwide.com</nowiki>/cgi-bin/cfg?cfgv=300<wbr />&bldv=aa.5.1.1.4<wbr />&'''apid'''='''<yourappid>'''<wbr />&apv=.54120<wbr />&apn=XXX<wbr />&bid=com.sample.osmpSamplePlayer<wbr />&sdkv=aa.5.1.1<wbr />&nuid=bffd02d414622b36801fe547fba9acef83239fd062d50e0ab76e9eeb306d34b5<wbr />&osver=ANDROID.4.4.2<wbr />&devtypid=samsung-SM-T230NU<wbr />&devid=47e100d36744f745ef04c17799f92bfc42840533a2267589149f2c0395829555<wbr />&enc=true<wbr />&fmt=json<wbr />&adf=<wbr />&uoo=<wbr />&longitude=<wbr />&latitude=<wbr />&tz=-14400<wbr />&locale=en_US<wbr />&lang=en<wbr />&ccode=1<wbr />&dma=<wbr />&sfcode=dcr-cert<wbr />&sendTime=1470591848<wbr />&rnd=1470591848353</code> | |||
==== Static ==== | |||
When you start your app after fresh install, and your app is measuring '''DCR''' Static content only, you should see a DCR static "app launch" known as "'''L'''" ping firing to secure-dcr-cert.imrworldwide.com server in your traffic-monitor. However, the "'''L'''" ping will be observed again if app goes into background and resumes back after 5 minutes. | |||
<code><nowiki>https://secure-dcr-cert.imrworldwide.com</nowiki>/cgi-bin/gn?prd=dcr<wbr />&ci=APRP7<wbr />&ch=APRP7_NA_defChnAsset<wbr />&asn=defChnAsset<wbr />&tl=<wbr />&c6=vc,NA<wbr />&c13=asid,'''<yourappid>'''<wbr />&c32=segA,<wbr />&c33=segB,<wbr />&c34=segC,<wbr />&c15=apn,MTVR-APT-QA<wbr />&sup=0<wbr />&segment2=539<wbr />&segment1=usa<wbr />&forward=1<wbr />&ad=1<wbr />&cr=L<wbr />&c9=devid,a69983bc65ad94f9e57109fec68cc847bf59575ee03cadb76b187f4c24eaf793<wbr />&enc=true<wbr />&c1=nuid,142a40706f9c03bfea020f7297828534a1f14895d7a8c5303d9b8a19b3337c13<wbr />&r=<wbr />&at=launch<wbr />&rt=text<wbr />&c16=sdkv,aa.4.0.0<wbr />&c27=cln,473<wbr />&crs=0<wbr />&si=<wbr />&lat=28.0 | |||
9<wbr />&lon=-82.76<wbr />&c29=plid,XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX<wbr />&c30=bldv,aa.4.0.0.3<wbr />&st=dcr<wbr />&c7=osgrp,DROID<wbr />&c8=devgrp,TAB<wbr />&c10=plt,MBL<wbr />&c40=adbid,<wbr />&c14=osver,ANDROID.4.4.4<wbr />&c26=1<wbr />&c35=<wbr />&c36=cref1,<wbr />&c37=cref2,<wbr />&c11=agg,1<wbr />&c12=apv,apt.4.0.0.3<wbr />&h33=2<wbr />&c51=adl,0<wbr />&c52=noad,0<wbr />&devtypid=asus-Nexus-7<wbr />&rnd=1432529128693</code> | |||
If your app is measuring DCR Video Content only, the "L" ping will '''not''' be observed upon app launch, only the “hello ping” will fire. | |||
===== Static "view" ping ===== | |||
For any sections that are tagged for static content, you should receive a DCR Static "view" ping. The first landing page should always be tagged. An example of this ping: | |||
<code><nowiki>https://secure-dcr-cert.imrworldwide.com</nowiki>/cgi-bin/gn?prd=dcr<wbr />&ci=APRP7<wbr />&ch=APRP7_NA_defChnAsset<wbr />&asn=defChnAsset<wbr />&tl=<wbr />&c6=vc,NA<wbr />&c13=asid,'''<yourappid>'''<wbr />&c32=segA,<wbr />&c33=segB,<wbr />&c34=segC,<wbr />&c15=apn,MTVR-APT-QA<wbr />&sup=0<wbr />&segment2=539<wbr />&segment1=usa<wbr />&forward=1<wbr />&ad=1<wbr />&cr=V<wbr />&c9=devid,a69983bc65ad94f9e57109fec68cc847bf59575ee03cadb76b187f4c24eaf793<wbr />&enc=true<wbr />&c1=nuid,142a40706f9c03bfea020f7297828534a1f14895d7a8c5303d9b8a19b3337c13<wbr />&r=<wbr />&at=view<wbr />&rt=text<wbr />&c16=sdkv,aa.4.0.0<wbr />&c27=cln,0<wbr />&crs=0<wbr />&si=<wbr />&lat=<wbr />&lon=<wbr />&c29=plid,XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX<wbr />&c30=bldv,aa.4.0.0.1<wbr />&st=dcr<wbr />&c7=osgrp,DROID<wbr />&c8=devgrp,TAB<wbr />&c10=plt,MBL<wbr />&c40=adbid,<wbr />&c14=osver,ANDROID.4.4.4<wbr />&c26=1<wbr />&c35=<wbr />&c36=cref1,<wbr />&c37=cref2,<wbr />&c11=agg,1<wbr />&c12=apv,apt.4.0.0.2<wbr />&h33=2<wbr />&c51=adl,0<wbr />&c52=noad,0<wbr />&devtypid=asus-Nexus-7<wbr />&rnd=1432068181560</code> | |||
==== Video ==== | |||
===== "cr" Value ===== | |||
Approximately 60 seconds into viewing of your stream, you should see a DCR Video "'''view'''" ping fire to secure-dcr-cert.imrworldwide.com server indicated by the '''cr''' value containing a "V" in the format of '''4__00_99_V1_00000'''. The significant values are highlighted below in Table 2. | |||
===== Duration Ping ===== | |||
The first duration ping is fired after you’ve viewed 5 minutes of content. You should see a DCR Video "'''duration'''" ping fire to secure-dcr-cert.imrworldwide.com indicated by the '''cr''' value containing a "D" in the format of '''4_00_99_D1_11111'''. This “D” ping should fire approximately | |||
every 5 minutes after this initial duration ping has fired or when the content switches to an advertisement The ad length (c51) is the total ad duration viewed in the previous session, and the ad count (c52) is the number of ads viewed in previous segment. The significant values are highlighted below in Table 3. | |||
===== View 5 minutes ===== | |||
View all channels for 5 minutes to ensure all channels fire a "duration" ping. | |||
===== Duration Ping ===== | |||
Play a stream and move the app to the background. A pending "duration" ping should fire; crediting the appropriate number of minutes viewed from last ping (i.e. '''4_00_99_D1_11100'''). No other pings should fire after it has been moved to the background. In case SDK does not get a chance to send out the ping while going to background, SDK will send the pending ping on next re-launch. | |||
===== Interruption ===== | |||
The same action will occur with any interruption to the stream’s playback (e.g., alarm, incoming call, etc.). | |||
== Digital Content Rating (DCR) Metadata == | |||
Use the monitoring tools and the device logs to view the following DCR metadata keys to ensure all parameters are being passed accordingly. Tag Parameters are listed in here: [[DCR_Pre-Certification_Checklist#Tag_Parameters]]. | |||
== DCR Metadata - Content == | |||
{| class="wikitable" | |||
|- | |||
! Key !! Description !! Purpose !! Example !! Tag Parameters | |||
|- | |||
| apid || App ID || This value should contain your AppID supplied by Nielsen || asid,XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX || &c13 | |||
|- | |||
| clientid || Parent Client ID || Value is automatically populated through the AppID supplied by Nielsen || us-123456 || &ci | |||
|- | |||
| subbrand || Sub-Brand (VCID) || This value is automatically populated through the AppID, which is Nielsen supplied || b01|| &c6 | |||
|- | |||
| type || Type of Asset || To distinguish between video content or static web | |||
| | |||
*<code>content</code> = Video measurement | |||
*<code>static</code> = static (websites, etc.) | |||
| &rt | |||
|- | |||
| program || Program Name || Descriptive of the content, should align with TV where applicable || <code>Big Bang Theory</code> || &cg | |||
|- | |||
| title || Episode Title || Descriptive of the content, should align with TV where applicable || <code>Big Bang Theory - S2 - E1</code> || &tl | |||
|- | |||
| assetid || Asset ID || Unique in-house ID assigned to Content and Ads (no [[Special Characters]])|| <code>XID345-67483</code> || &ch | |||
|- | |||
| isfullepisode || Full Episode Flag || To distinguish between full episodic and non-full episodic content for reporting | |||
| | |||
*<code>y</code> = Full Episode | |||
*<code>n</code> = Not full Episode (Clip) | |||
| &c53 | |||
|- | |||
| length || Length || Length of content in seconds minus ads. For live content, use "0" || <code>3600</code> || &sd | |||
|- | |||
| segA || Segment A || Client customized metadata – Static Only || <code>CustomSegmentValueA</code> || &c32 | |||
|- | |||
| segB || Segment B || Client customized metadata (e.g., genre, category) || <code>CustomSegmentValueB</code> || &c33 | |||
|- | |||
| segA || Segment A || Client customized metadata (e.g., genre, category) || <code>CustomSegmentValueC</code> || &c34 | |||
|- | |||
| adloadtype || Ad load type || The type of ad load | |||
| | |||
*<code>1</code> = Linear (Match ad load) | |||
*<code>2</code> = Dynamic Ad Insertion (DAI) | |||
| &c57 | |||
|- | |||
| airdate || Air date || Original air date and time in Eastern Time in US. For all other countries, it should be local time || <code>YYYY HH:MM:SS</code> (<code>HH</code>=24 hour) || &c54 | |||
|} | |||
''If this ping fails to fire, a common cause is improper metadata being passed to the SDK. Examples of the proper metadata to be passed in the loadMetadata() API call can be found in the Developer's Guide'' | |||
== Test Case for Ad Measurement Metadata == | |||
The measurement of ad metadata is a playback program content that contains advertising that has had ad metadata correctly integrated (e.g., preroll, midroll and postroll). The '''/gn''' pings signify DCR, and it will fire with each instance, which should render the correct values for the advertising played in the c51 (ad duration) and c52 (ad count) parameters. | |||
*c51=<code>adl</code>, number of seconds ads played | |||
*c52=<code>noad</code>, number of individual ads | |||
<blockquote>'''Note:''' these parameters are only populated on a D ping following an ad break</blockquote> | |||
Below is an example of a content that was played for 4 minutes with a 28 second ad. | |||
<code><nowiki>https://secure-dcr-cert.imrworldwide.com</nowiki>/cgi-bin/gn?prd=dcr<wbr /><wbr />'''&ci'''=us-500207<wbr />'''&ch'''=us-500207_c77<wbr />'''&asn'''=defChnAsset<wbr />'''&tl'''=Big%20Buck%20Bunny<wbr />'''&prv'''=1<wbr />'''&c6'''=vc,c77<wbr />'''&ca'''=us-500207_c77_2015Q2<wbr />'''&cg'''=MyProgram<wbr />'''&c13'''=asid,TBF0638A2-XXXX-XXXX-XXXXF45A0DA3B47C<wbr />'''&c32'''=segA,<wbr />'''&c33'''=segB,<wbr />'''&c34'''=segC,<wbr />'''&c15'''=apn,SDK%20Sample%20Player<wbr />'''&sup'''=1<wbr />'''&segment2'''=539<wbr />'''&segment1'''=usa<wbr />'''&forward'''=0<wbr />'''&ad'''=1<wbr />'''&cr'''=4_00_99_D1_11110<wbr />'''&c9'''=devid,42ec6a26b000ccd34015ba8625ee29cd283190a8c00f1622f356e900bb5b2a23<wbr />'''&enc'''=true<wbr />'''&c1'''=nuid,00b5926fea1807638ebfe6f04af6a455c5d9b2a1ed3e39f550f44daa39d0886d<wbr />'''&at'''=timer<wbr />'''&rt'''=video<wbr />'''&c16'''=sdkv,aa.4.0.0<wbr />'''&c27'''=cln,216<wbr />'''&crs'''=0<wbr />'''&si'''=<wbr />'''&lat'''=<wbr />'''&lon'''=<wbr />'''&c29'''=plid,TBF0638A2-XXXX-XXXXXXXF45A0DA3B47C<wbr />'''&c30'''=bldv,aa.4.0.0.5<wbr />'''&st'''=dcr<wbr />'''&c7'''=osgrp,DROID<wbr />'''&c8'''=devgrp,TAB<wbr />'''&c10'''=plt,MBL<wbr />'''&c40'''=adbid,<wbr />'''&c14'''=osver,ANDROID.4.4.4<wbr />'''&c26'''=dmap,1<wbr />'''&dd'''=<wbr />'''&hrd'''=<wbr />'''&wkd'''=<wbr />'''&c35'''=adrsid,<wbr />'''&c36'''=cref1,<wbr />'''&c37'''=cref2,<wbr />'''&c11'''=agg,1<wbr />'''&c12'''=apv,1.0.1.4.1<wbr />'''&h33'''=2<wbr />'''&c51'''=adl,28<wbr />'''&c52'''=noad,1<wbr />'''&sd'''=<wbr />'''&devtypid'''=samsung-SAMSUNG-SM-N910A<wbr />'''&rnd'''=1434634421194</code> | |||
Once your app has passed all the test cases and scenarios referenced in this pre-certification checklist, we’re confident that it will also pass Nielsen’s certification process. Upon completion of the checklist, please submit the test results (i.e., monitor logs, worksheet, and test app) to your Nielsen Digital Implementation Manager for certification. | |||
=== DCR Metadata - AD === | |||
{| class="wikitable" | |||
|- | |||
! Key !! Description !! Example | |||
|- | |||
| type || Type of Ad || <code>preroll</code>, <code>midroll</code>, <code>postroll</code> | |||
|- | |||
| assetid || Unique ID assigned to the ad || XID345-67483 | |||
|} | |||
== Total Content Ratings (TCR) Metadata == | |||
=== Total Content Ratings (TCR) === | |||
Total Content Ratings (TCR) provides content measurement on TV and Digital. Bringing together TV and Digital measurement in reporting requires maintaining consistent metadata for your content where it is offered. | |||
=== DCR === | |||
DCR is a key component to measuring viewing on digital platforms. There are a number of DCR metadata keys that are crucial to TCR measurement. The following table provides guidance on the values that are expected to be passed in the required metadata keys that will be used or TCR. | |||
====TCR Metadata==== | |||
{| class="wikitable" | |||
|- | |||
! Key !! Description !! Purpose !! Example | |||
|- | |||
| program || Program Name || Program name must be identical to program name passed in TV metadata. It is recommended to use the metadata registered in Nielsen TV Names systems (myEVNTS/myVOD). If Nielsen TV Names systems are not used, then you may use the name registered with a 3rd party television listing service. || <code>Big Bang Theory</code> | |||
|- | |||
| title || Episode Title || Episode name must be identical to episode name passed in TV metadata. It is recommended to use the metadata registered in Nielsen TV Names systems (myEVNTS/myVOD). If Nielsen TV Names systems are not used, then you may use the name registered with a 3rd party television listing service. || <code>Big Bang Theory - S2 - E1 – LF</code> | |||
|- | |||
| airdate || Airdate || The date the episode was first made available on TV. This value is used as the default episode name when the episode metadata is not available. || <code>YYYY HH:MM:SS</code> (<code>HH</code>=24 hour) | |||
|- | |||
| isfullepisode || Full Episode Flag || To distinguish between full episodic and non-full episodic content for reporting. Full Episodes are eligible for TCR reporting. A value of "y" should be passed to identify full episodes. | |||
| | |||
*<code>y</code> = Full Episode | |||
*<code>n</code> = Not full Episode (Clip) | |||
|- | |||
| crossId1 || Cross Reference ID1 || '''Standard Episode ID''' - The ID should be a unique value for each episode. You can use the episode ID that is registered through Nielsen TV Names systems (myEVNTS/myVOD) or a 3rd party television listing service. (i.e., Gracenote/Tribune ID, Enterprise ID) || <code>gNID123</code> | |||
|- | |||
| crossId2 || Cross Reference ID2 || '''Content Originator ID''' - The ID is used to identify the originator of the content. This value is only required for distributors. Distributors will be provided a listing of content originator IDs from Nielsen that should be passed for secondary crediting. '''Required for Distributors''' || <code>ABC</code> | |||
|} | |||
=== Passing Metadata === | |||
The required metadata can be passed as key-values through the loadMetadata() method. All values should be passed as strings. The sample code below shows a metadata JSON object for a video and static asset: | |||
==== Video Asset Example ==== | |||
<syntaxhighlight lang="json"> | |||
jsonMetadata={ | |||
type: "content", | |||
assetid: "VID345-67483", | |||
isfullepisode: "y", | |||
program: "programName", | |||
title: "Program S3 - EP1", | |||
length: "3600", | |||
segB: "segmentB", | |||
segC: "segmentC", | |||
crossId1: "CS-1", | |||
crossId2: "CS-2", | |||
airdate: "20161013 20:00:00", | |||
adloadtype: "2", | |||
mediaURL: "http://../exampledomain.com", | |||
hasAds: "1" | |||
}; | |||
</syntaxhighlight> | |||
==== Static Asset Example ==== | |||
<syntaxhighlight lang="json"> | |||
jsonMetadata={ | |||
type: "static", | |||
assetid: "SID724-38054", | |||
section: "App Section", | |||
segA: "segmentA", | |||
segB: "segmentB", | |||
segC: "segmentC" | |||
}; | |||
</syntaxhighlight> | |||
==== Ad Asset Example ==== | |||
<syntaxhighlight lang="json"> | |||
jsonMetadata={ | |||
type: "preroll", | |||
assetid ad: "AD361-84413" | |||
}; | |||
</syntaxhighlight> | |||
== Tag Parameters == | |||
{| class="wikitable" | |||
|- | |||
! Parameter !! Description !! Supplier !! Data Type !! Value | |||
|- | |||
| &ci || Client ID || Nielsen || Static || | |||
|- | |||
| &ch || Channel Asset - Channel Asset is not one to one mapping to content id. One channel asset can have multiple content IDs. || SDK || Dynamic || | |||
|- | |||
|&asn || Site Section/Asset Name || Client || Dynamic || | |||
|- | |||
|&tl || Episode Title || Client || Dynamic || | |||
|- | |||
|&c6 || Sub-Brand || Nielsen || Static || dcr, | |||
|- | |||
|&ca || Content ID - unique ID generated by SDK based on ci, vcid, and the metadata for the Asset ID. || SDK || Dynamic || | |||
|- | |||
|&cg || Program Name || Client || Dynamic || | |||
|- | |||
|&c13 || App ID - A Nielsen ID for player/site/app assigned when onboarding. The client ID and sub-brand values are configured to the App ID. || Nielsen || Static || asid, | |||
|- | |||
|&c32 || Segment A || Client || Dynamic || segA, | |||
|- | |||
|&c33 || Segment B || Client || Dynamic || segB, | |||
|- | |||
|&c34 || Segment C || Client || Dynamic || segC, | |||
|- | |||
|&c15 || App Name || Client || Dynamic || apn, | |||
|- | |||
|&sup || Suppress || SDK || Dynamic || | |||
|- | |||
|&segment2 || Designated Market Area (DMA) || Client/SDK || Dynamic || | |||
|- | |||
|&segment1 || Country Code || Client/SDK || Dynamic || | |||
|- | |||
|&forward || Backend forward flag || SDK || Dynamic || 1 (e.g. forward to Facebook on backend) | |||
|- | |||
|&ad || Access Method || SDK || Static || ad, | |||
|- | |||
|&cr || Segment Code || SDK || Dynamic || crediting ping identifier: 4_00_99_V1_0000 | |||
|- | |||
|&c9 || Advertising ID - IDFA on iOS or Google Advertising ID on Android || SDK || Dynamic || devid, | |||
|- | |||
|&enc || Hash Indicator || SDK || Dynamic || true (e.g. hashed with SHA 256) false (e.g. unhashed) | |||
|- | |||
|&c1 || NUID || SDK || Dynamic || nuid, | |||
|- | |||
|&at || Action Type || SDK || Dynamic || "view" or 'timer' | |||
|- | |||
|&rt || Resource Type || SDK || Dynamic || video (or text if Static) | |||
|- | |||
|&c16 || SDK Version || SDK || Dynamic || sdkv, | |||
|- | |||
|&c27 || Browser/App Duration (in seconds) || SDK || Dynamic || cln, 0 | |||
|- | |||
|&crs || Crash Identifier || SDK || Dynamic || n/a | |||
|- | |||
|&lat || GPS Latitude || SDK || Dynamic || n/a | |||
|- | |||
|&lon || GPS Longitude || SDK || Dynamic || n/a | |||
|- | |||
|&c29 || Player ID || SDK || Dynamic || plid, | |||
|- | |||
|&c30 || Build Version || SDK || Dynamic || bldv, | |||
|- | |||
|&st || Product (Sub-Resource Type) || SDK || Static || dcr | |||
|- | |||
|&c7 || OS Grouping || SDK || Dynamic || osgrp, | |||
|- | |||
|&c8 || Device Grouping || SDK || Dynamic || devgrp, | |||
|- | |||
|&c10 || Platform || SDK || Dynamic || plt, | |||
|- | |||
|&c40 || Adobe ID - Adobe Visitor ID || Client || Dynamic || abide, | |||
|- | |||
|&c14 || OS Version || SDK || Dynamic || over, | |||
|- | |||
|&c26 || GPS Precision || SDK || Dynamic || 3 (Passed in from the host App) 1 (IP Address (v4 or v6)) | |||
|- | |||
|&dd || Reporting Data Date || SDK || Dynamic || (e.g. data date in YYYYMMDD format) | |||
|- | |||
|&hrd || HourCD || SDK || Dynamic || n/a | |||
|- | |||
|&wkd || DayCD || SDK || Dynamic || n/a | |||
|- | |||
|&c35 || Adobe Report Suite ID || Adobe || Dynamic || adrsid, | |||
|- | |||
|&c36 || Cross Reference ID1 || Client || Dynamic || cref1, | |||
|- | |||
|&c37 || Cross Reference ID2 || Client || Dynamic || cref2, | |||
|- | |||
|&c11 || Aggregator || SDK || Dynamic || agg, | |||
|- | |||
|&c12 || App Version || Client || Dynamic || apv, | |||
|- | |||
|&c51 || Total Ad Duration (in secs) || SDK || Dynamic || adl,0 | |||
|- | |||
|&c52 || Number of Ads || SDK || Dynamic || noad,0 | |||
|- | |||
|&sd || Set Duration (length) || Client || Dynamic || | |||
|- | |||
|&devtypid || Device Type || SDK || Dynamic || | |||
|- | |||
|&c53 || isfullepisode flag || Client || Dynamic || fef, | |||
|- | |||
|&c54 || Airdate || Client || Dynamic || oad, | |||
|- | |||
|&c55 || Segment || Client || Dynamic || cref3, | |||
|- | |||
|&c57 || Adloadtype || Client || Dynamic || adldf, | |||
|- | |||
|&c3 || Content/Ad identifier || SDK || Dynamic st,c (content) or st,a (ad) | |||
|- | |||
|&c64 || Start Time || Client || Dynamic || starttm, | |||
|- | |||
|&c58 || isLive flag || Client || Dynamic || isLive, | |||
|- | |||
|&c59 || Session id || SDK || Dynamic || sesid, | |||
|- | |||
|&c61 || Create Time || SDK || Dynamic || createtm, | |||
|- | |||
|&c63 || pipMode || Client || Dynamic || "true" or "" | |||
|- | |||
|&c62 || Send Time || SDK || Dynamic || sendTime, <1470421076> | |||
|- | |||
|&c68 || Bundle id || SDK || Dynamic || bndlid, | |||
|- | |||
|&c73 || Device Type || SDK || Dynamic || phtype, | |||
|- | |||
|&c74 || Device Name || SDK || Dynamic || dvcnm, | |||
|- | |||
|&c77 || adsuprt || Client || Dynamic || 0=no ads, 1=ads, 2=unknown | |||
|- | |||
|&c71 || OTT flag || SDK || Dynamic || ottflg,<0 (false) or 1 (true)> | |||
|- | |||
|&c72 || OTT type || SDK || Dynamic || otttyp, | |||
|- | |||
|&si || Site Identifier || SDK || Dynamic || n/a | |||
|- | |||
|&c66 || Media URL || Client || Dynamic || | |||
|- | |||
|&vtoff || View Time Offset Adobe || Dynamic || Seconds || offset/back from epoc (will be blank in w/ non batched) | |||
|- | |||
|&rnd || Random Number || SDK || Dynamic || random number (cache buster) | |||
|} | |||
== Nielsen Privacy Page Implementation == | |||
1. Complete an opt-out in your app through the Nielsen opt-out webview. | |||
2. User opt-out, a goodbye ping is fired off to the Nielsen server. | |||
=== Example Goodbye Ping: === | |||
<code>&uoo=true</code> | |||
<code><nowiki>https://secure-dcr-cert.imrworldwide.com</nowiki>/cgi-bin/cfg?cfgv=300<wbr />&bldv=aa.5.1.1.4<wbr />&apid='''<yourappid>'''<wbr />&apv=.54120<wbr />&apn=XXX<wbr />&bid=com.sample.osmpSamplePlayer<wbr />&sdkv=aa.5.1.1<wbr />&nuid=bffd02d414622b36801fe547fba9acef83239fd062d50e0ab76e9eeb306d34b5<wbr />&osver=Android4.4.2<wbr />&devtypid=samsung-SMT230NU<wbr />&devid=47e100d36744f745ef04c17799f92bfc42840533a2267589149f2c0395829555<wbr />&enc=true<wbr />&fmt=json<wbr />&adf=<wbr />&uoo=true<wbr />&longitude=<wbr />&latitude=<wbr />&tz=-14400<wbr />&locale=en_US<wbr />&lang=en<wbr />&ccode=1<wbr />&dma=<wbr />&sfcode=dcrcert<wbr />&sendTime=1470593599<wbr />&rnd=1470593599249</code> | |||
3.Watch any content (static or video) for at least three minutes. You will not see any pings rendering. | |||
4. Opt back in, a '''hello ping''' is fired off to the Nielsen server. | |||
=== Example Hello Ping === | |||
<code>&uoo= [blank] or &uoo=false</code> | |||
<code><nowiki>https://secure-dcr-cert.imrworldwide.com</nowiki>/cgi-bin/cfg?cfgv=300<wbr />&bldv=aa.5.1.1.4<wbr />&apid='''<yourappid>'''<wbr />&apv=.54120<wbr />&apn=XXX<wbr />&bid=com.sample.osmpSamplePlayer<wbr />&sdkv=aa.5.1.1<wbr />&nuid=bffd02d414622b36801fe547fba9acef83239fd062d50e0ab76e9eeb306d34b5<wbr />&osver=Android4.4.2<wbr />&devtypid=samsung-SMT230NU<wbr />&devid=47e100d36744f745ef04c17799f92bfc42840533a2267589149f2c0395829555<wbr />&enc=true<wbr />&fmt=json<wbr />&adf=<wbr />&uoo=<wbr />&longitude=<wbr />&latitude=<wbr />&tz=-14400<wbr />&locale=en_US<wbr />&lang=en<wbr />&ccode=1<wbr />&dma=<wbr />&sfcode=dcr-cert<wbr />&sendTime=1470593666<wbr />&rnd=1470593666380</code> | |||
5. Watch any video content for at least three minutes and you should see V/D pings - '''view''' and '''duration''' pings. | |||
'''Your testing is complete for DCR and it's now time to start the app certification process with Nielsen!''' | |||
== Requirements to Start App Certification == | |||
The Pre-certification Checklist is a pre-requisite requirement that must be completed with each app being tested. Once testing is complete, provision this same test app build to Nielsen, and send the checklist results, which are the SDK debug logs and monitor sessions (i.e., Charles) per test scenario to your TAM for verification. Please individually-name each session log according to the test scenario performed. Additionally, make sure that all content to be used for testing is CMS enabled, and is consistently available at all times. Any interruptions or intermittence in the flow will cause delays in testing, increased troubleshooting sessions and can prolong the certification process. | |||
*You must enable the Debug flag in the development environment to check whether an AppSDK API call is made successfully in the device log | |||
**To activate the Debug flag, pass the argument @"nol_devDebug":@"XXXXX", in the JSON string for initWithAppInfo, as below. Where "XXXXX" is one of the following: | |||
***'''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. | |||
***'''WARNING:''' Indicates potential integration / configuration errors or SDK issues. | |||
***'''ERROR:''' Indicates important integration errors or non-recoverable SDK issues. | |||
***'''DEBUG:''' Debug logs, used by the developers to debug more complex issues. | |||
<syntaxhighlight lang="swift"> | |||
NSDictionary* appInformation = @{ | |||
@ "appid": appID, | |||
@ "appversion" : appVersion, | |||
@ "appname": appName, | |||
@ "sfcode": sfcode, | |||
@ "nol_devDebug": @"INFO"}; | |||
NSData* jsonDataAppInfo = [NSJSONSerialization | |||
dataWithJSONObject:appInformation options:0 error:nil]; | |||
NSString* jsonStringAppInfo = [[NSString alloc] initWithBytes: | |||
[jsonDataAppInfo bytes] length: [jsonDataAppInfo length] | |||
encoding:NSUTF8StringEncoding]; | |||
nlsAppApiMeter = [[NielsenAppApi sharedInstance] | |||
initWithAppInfo:jsonStringAppInfo]; | |||
</syntaxhighlight> | |||
*Once the flag is enabled, it logs each API call made and the data passed. The log created by this flag is minimal. | |||
'''DO NOT leave the nol_devDebug flag enabled when your app has moved into production!''' | |||
*Nielsen must receive a production-ready version of your app provisioned to a minimum of 7 Nielsen devices to test on a mixture of devices and operating systems. | |||
Nielsen will provide feedback on all defects found throughout the entire testing and certification process. | |||
== Testing Results Worksheet == | |||
{| class="wikitable" | |||
|- | |||
! Questions !! Your Results | |||
|- | |||
| Record the Test Device ID: || | |||
|- | |||
| What type of App are you testing? Universal Device-type specific App (e.g. Phone, Tablet, iPod, etc.) || | |||
|- | |||
| Devices and OS Tested: || | |||
|- | |||
| Type of content being tested in the app: StaticVideoBoth || | |||
|- | |||
| Is forward/rewind or pause modes available: Please describe. || | |||
|- | |||
| Nielsen Policy Page (Opt-out/Opt-in): || | |||
|- | |||
| Background/Foreground – Same Video: || | |||
|- | |||
| Background/Foreground – Different Video: || | |||
|- | |||
| Channel Change: || | |||
|- | |||
| Interruption – Incoming Call: || | |||
|- | |||
| Interruption – Airport Mode/Wi-Fi: || | |||
|- | |||
| Interruption – Alarm/Sleep: || | |||
|- | |||
| Headphone Removal: || | |||
|- | |||
| Kill and Re-launch: || | |||
|- | |||
| Please list any functions which will need special instructions or any known defects in your app: || | |||
|} | |||
== Test Scenarios == | |||
{| class="wikitable" | |||
|- | |||
! Steps to Perform !! Record This !! Verification Steps !! What is this testing? | |||
|- | |||
| '''Nielsen Privacy Policy:''' Navigate to Nielsen's "About Nielsen Measurement" page and clicks on Opt-out, then play a video for 10 mins. Navigate back to Nielsen measurement Opt-out page, and Optin. Play same video for 5 mins. | |||
| | |||
#Opt-out time | |||
#Video start time | |||
#Video end time | |||
#Opt-in time | |||
#Video start time | |||
#Video end time. | |||
| | |||
#Opt-out page should be available in all the supported languages - The URL to this webpage should be called from the SDK and opened in webview within the App. | |||
#'''Goodbye ping''' fires with '''uoo=true''' upon opt-out. Pings will still fire, but will be discarded on Nielsen's backend. | |||
#'''Hello ping''' fires with '''uoo=false''' when opted back in and play resumes. New set of '''V/D''' pings should fire for 5 minutes of streaming. | |||
| | |||
#Opt-out / opt-in implemented correctly. | |||
#Playback resumes and play, loadMetadata, and playheadPosition tags called after video is interrupted; even for the same channel. | |||
|- | |||
| '''Background/Foreground – Same Video''': Terminate the app and open it from a clean start. Play a video for 5 mins. Stop the video and put the app in the background. Stay in the background for 5 mins. Bring the app to the foreground and play the '''SAME''' video again for 5 mins. | |||
| | |||
#Video start time. | |||
#Video stop time and put app in background. | |||
#Time when app is put into foreground. | |||
#Video play time. | |||
| | |||
#'''Hello ping''' is received when App launches (if 1st launch). | |||
#'''V/D''' pings fire when video plays. | |||
#App goes into background, '''stop''' method should be called when video pauses. As a result, pending pings fires upon video stop. | |||
#Video isn’t playing in the background and no measurement pings fire. | |||
#Different scenarios for iOS and Android when the video resumes from background: | |||
*'''iOS:''' '''V/D''' pings fire when video resumes. | |||
*'''Android:''' only '''Duration''' ping fires when same video resumes. | |||
| | |||
#SDK is being initialized correctly. | |||
#The stop method should be called and no API is called in the background | |||
#loadMetadata and playheadPosition methods are called upon resuming video in the foreground. | |||
|- | |||
| '''Background/Foreground – Different Video''':Terminate the app and open it from a clean start. Play a video for 5 mins. Stop the video and put the app in the background. Stay in the background for 5 mins. Bring the app to the foreground and play a '''DIFFERENT''' video for 5 mins | |||
| | |||
#Video start time. | |||
#Video stop time and put app in background. | |||
#Time when app is put into foreground. | |||
#Video play time | |||
| | |||
#'''Hello ping''' is received when App launches (if 1st launch). | |||
#'''V/D''' pings fire when video plays. | |||
#App goes into background, '''stop''' method should be called when video pauses. As a result, pending pings fires upon video stop. | |||
#Video isn’t playing in the background and no measurement pings fire. | |||
#Different scenarios for iOS and Android when the video resumes from background: | |||
*'''iOS:''' '''V/D''' pings fire when video resumes. | |||
*'''Android:''' '''V/D''' pings fire when different video plays on resume. | |||
| | |||
#SDK is being initialized correctly. | |||
#The stop method should be called and no API is called in the background. | |||
#Play, loadMetadata, and playheadPosition methods are called upon resuming video in the foreground. | |||
|- | |||
| '''Video Change:''' Play Video1 for 3 mins, then switch to Video2 without stopping Video1 and play for 2 mins and stop viewing. | |||
| | |||
#Video1 start time. | |||
#Video1 stop time. | |||
#Video2 start time. | |||
#Video2 stop time. | |||
| | |||
#V/D pings are triggered for Video1. | |||
#On video change, pending ping is fired upon stop for Video1. | |||
#New V/D pings are triggered for Video2. | |||
| | |||
#The stop method should be called upon video change. | |||
#Playback resumes, and play, loadMetadata and playheadPosition methods are triggered. | |||
|- | |||
| '''Interruption – Incoming Call:''' Stream content for 3 mins. Call the device to create an interruption. Video will stop playing. After 5 mins, resume the video activity for 3 mins. | |||
| | |||
#Video start time. | |||
#Interruption time. | |||
#Video start time. | |||
| | |||
#V/D pings are triggered. | |||
#Pending ping fires when the call interrupts the video. | |||
#Once playback resumes from the interruption, there are different scenarios for iOS and Android: | |||
*'''iOS:''' '''V/D''' pings fire when video resumes. | |||
*'''Android:''' only '''Duration''' ping fires when same video resumes. | |||
| | |||
#The stop method should be called when the interruption occurs. | |||
#Playback resumes, and play, loadMetadata and playheadPosition methods are triggered. | |||
|- | |||
| '''Interruption – Airport Mode/Wi-Fi:''' Stream content for 3 mins. Switch airport mode ON. Video will stop playing after buffering has ended. After 5 mins, turn airplane mode OFF. Resume the video activity for 3 mins. | |||
| | |||
#Video start time. | |||
#Interruption time. | |||
#Video resumes time. | |||
| | |||
#V/D pings are triggered. | |||
#Pending ping doesn’t occur until connectivity is reestablished. | |||
#Once reconnected, and playback resumes from the interruption, there are different scenarios for iOS and Android: | |||
*'''iOS:''' '''V/D''' pings fire when video resumes. | |||
*'''Android:''' only '''Duration''' ping fires when same video resumes. | |||
| | |||
#The stop method should be called when the interruption occurs. | |||
#Playback resumes, and loadMetadata and playheadPosition methods are triggered. | |||
|- | |||
| '''Interruption – Alarm/Sleep:''' Create an alarm or other timed interruption. Stream content until the interruption happens.After 5 mins, resume the video activity for 3 mins. | |||
| | |||
#Video start time. | |||
#Interruption time. | |||
#Video resumes time. | |||
| | |||
#'''V/D''' pings are triggered. | |||
#Pending ping fires when the video is interrupted. | |||
#Once playback resumes from the interruption, there are different scenarios for iOS and Android: | |||
*'''iOS:''' '''V/D''' pings fire when video resumes. | |||
*'''Android:''' only '''Duration''' ping fires when same video resumes. | |||
| | |||
#The stop method should be called when the interruption occurs. | |||
#Playback resumes, and loadMetadata and playheadPosition methods are triggered. | |||
|- | |||
| '''Headphone – iOS ONLY:''' Insert headphone into your iOS device. Stream content for 3 mins and unplug the headphones.Re-insert the headphones. | |||
| | |||
#Video start time. | |||
#Unplug the headphone time. | |||
#Video resumes time. | |||
| | |||
#Duration ping will fire when the headphones are unplugged, and the audio will stop playing. | |||
#Once playback resumes, measurement pings should fire. | |||
| | |||
#The stop method should be called when the interruption occurs. | |||
#Playback resumes and loadMetadata and playheadPosition methods are triggered. | |||
|- | |||
| '''Kill and Relaunch:''' Terminate the app and open it from a fresh start. Play a video for 2 mins. Kill the app while video is playing. Relaunch the app and play any video for 5 mins. | |||
| | |||
#Video start time. | |||
#App terminated time. | |||
#App relaunch time. | |||
#Video start time. | |||
| | |||
#'''Hello ping''' fires when the app launches (if 1st launch). | |||
#'''V/D''' pings fire. | |||
#Pending ping fires when the app is terminated. '''NOTE: If using an Android, this might not happen in some scenarios.''' | |||
#'''Hello ping''' fires upon relaunch. | |||
#'''V/D''' pings are triggered. | |||
| | |||
#The stop method should be called when the video is interrupted; even when the app is killed or quit. Some android kill methods will prevent pending pings from firing right away. | |||
|} | |||
== Obtaining Your Device Identifier == | |||
Nielsen will need your device's identifier to distinguish your test data from other devices. | |||
=== iOS Devices === | |||
#You can obtain your device's Advertising Identifier with this app: | |||
##https://itunes.apple.com/us/app/the-identifiers/id564618183 | |||
#Install and open the app on your Apple device | |||
#From the "Raw" tab, use the "Advertising Identifier" | |||
=== Android Devices === | |||
# Go into "Settings" | |||
# Select "Google" | |||
# Select "Ads" | |||
# Advertising ID is on the bottom under "Your advertising ID:" |
Latest revision as of 15:24, 6 April 2023
App Pre-Certification Checklist
The purpose of this document is to provide instruction on determining if your implementation of Digital Content Ratings (DCR) via App is ready to be submitted for certification. This document provides you the ability understand what is expected after implementation and before submitting to Nielsen. After all checks in this document are completed and passed, your Digital Implementation Manager (DIM) will further assess the implementation’s readiness for certification.
Before You Start
Item | |
---|---|
☐ | For testing, your AppID should start with a "P" and your sfcode should be set to "dcr-cert". |
☐ | The opt-out/opt-in functionality has been implemented within your App. |
☐ | Ensure the AppSDK initializes and the API events are enabled for DCR. |
☐ | Ensure stop API for all scenarios where the video could be interrupted (e.g., alerts, alarm, calendar, incoming calls, killing the app, channel change, stop/pause, background/foreground, etc.). |
☐ | Android:setPlayheadPosition). |
☐ | Record the Device Identifier of your test device for your Digital Implementation Manager. See DCR_Pre-Certification_Checklist#Obtaining Your Device Identifier. |
☐ | Ensure that all content is consistently available and CMS enabled. Any interruptions or intermittence in the flow will cause delays in the testing process for all parties involved. |
Monitoring Tools
You will need an HTTP traffic-monitoring tool, such as Charles or Fiddler.
- Charles: http://www.charlesproxy.com/
- Fiddler: http://www.telerik.com/fiddler
Testing Your App Implementation
Capture Traffic
To capture traffic from the SDK, filter HTTP traffic with the string "imr", as seen in Figure 1. This will capture traffic going to Nielsen servers. You will then need to set up your device to proxy to this traffic analyzer. Instructions may vary from device to device and are available online.
- Charles: View → Focused Hosts
- Fiddler: Filters (tab)
Ensure opt-in
If you previously tested the opt-out function or app disable feature, make sure that an opt-in was completed on your device before continuing. Terminate your app completely before starting.
"Hello" Ping
The first HTTPS traffic you should see is the SDK request for configuration information, called a "hello ping". An example has been included below. In order to see this ping, Charles/Fiddler has to be configured to capture HTTPS traffic. This ping will be cached in memory, so it will be seen only on the first launch of the app or when metadata changes.
https://secure-dcr-cert.imrworldwide.com/cgi-bin/cfg?cfgv=300
Static
When you start your app after fresh install, and your app is measuring DCR Static content only, you should see a DCR static "app launch" known as "L" ping firing to secure-dcr-cert.imrworldwide.com server in your traffic-monitor. However, the "L" ping will be observed again if app goes into background and resumes back after 5 minutes.
https://secure-dcr-cert.imrworldwide.com/cgi-bin/gn?prd=dcr
If your app is measuring DCR Video Content only, the "L" ping will not be observed upon app launch, only the “hello ping” will fire.
Static "view" ping
For any sections that are tagged for static content, you should receive a DCR Static "view" ping. The first landing page should always be tagged. An example of this ping:
https://secure-dcr-cert.imrworldwide.com/cgi-bin/gn?prd=dcr
Video
"cr" Value
Approximately 60 seconds into viewing of your stream, you should see a DCR Video "view" ping fire to secure-dcr-cert.imrworldwide.com server indicated by the cr value containing a "V" in the format of 4__00_99_V1_00000. The significant values are highlighted below in Table 2.
Duration Ping
The first duration ping is fired after you’ve viewed 5 minutes of content. You should see a DCR Video "duration" ping fire to secure-dcr-cert.imrworldwide.com indicated by the cr value containing a "D" in the format of 4_00_99_D1_11111. This “D” ping should fire approximately every 5 minutes after this initial duration ping has fired or when the content switches to an advertisement The ad length (c51) is the total ad duration viewed in the previous session, and the ad count (c52) is the number of ads viewed in previous segment. The significant values are highlighted below in Table 3.
View 5 minutes
View all channels for 5 minutes to ensure all channels fire a "duration" ping.
Duration Ping
Play a stream and move the app to the background. A pending "duration" ping should fire; crediting the appropriate number of minutes viewed from last ping (i.e. 4_00_99_D1_11100). No other pings should fire after it has been moved to the background. In case SDK does not get a chance to send out the ping while going to background, SDK will send the pending ping on next re-launch.
Interruption
The same action will occur with any interruption to the stream’s playback (e.g., alarm, incoming call, etc.).
Digital Content Rating (DCR) Metadata
Use the monitoring tools and the device logs to view the following DCR metadata keys to ensure all parameters are being passed accordingly. Tag Parameters are listed in here: DCR_Pre-Certification_Checklist#Tag_Parameters.
DCR Metadata - Content
Key | Description | Purpose | Example | Tag Parameters |
---|---|---|---|---|
apid | App ID | This value should contain your AppID supplied by Nielsen | asid,XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX | &c13 |
clientid | Parent Client ID | Value is automatically populated through the AppID supplied by Nielsen | us-123456 | &ci |
subbrand | Sub-Brand (VCID) | This value is automatically populated through the AppID, which is Nielsen supplied | b01 | &c6 |
type | Type of Asset | To distinguish between video content or static web |
|
&rt |
program | Program Name | Descriptive of the content, should align with TV where applicable | Big Bang Theory |
&cg |
title | Episode Title | Descriptive of the content, should align with TV where applicable | Big Bang Theory - S2 - E1 |
&tl |
assetid | Asset ID | Unique in-house ID assigned to Content and Ads (no Special Characters) | XID345-67483 |
&ch |
isfullepisode | Full Episode Flag | To distinguish between full episodic and non-full episodic content for reporting |
|
&c53 |
length | Length | Length of content in seconds minus ads. For live content, use "0" | 3600 |
&sd |
segA | Segment A | Client customized metadata – Static Only | CustomSegmentValueA |
&c32 |
segB | Segment B | Client customized metadata (e.g., genre, category) | CustomSegmentValueB |
&c33 |
segA | Segment A | Client customized metadata (e.g., genre, category) | CustomSegmentValueC |
&c34 |
adloadtype | Ad load type | The type of ad load |
|
&c57 |
airdate | Air date | Original air date and time in Eastern Time in US. For all other countries, it should be local time | YYYY HH:MM:SS (HH =24 hour) |
&c54 |
If this ping fails to fire, a common cause is improper metadata being passed to the SDK. Examples of the proper metadata to be passed in the loadMetadata() API call can be found in the Developer's Guide
Test Case for Ad Measurement Metadata
The measurement of ad metadata is a playback program content that contains advertising that has had ad metadata correctly integrated (e.g., preroll, midroll and postroll). The /gn pings signify DCR, and it will fire with each instance, which should render the correct values for the advertising played in the c51 (ad duration) and c52 (ad count) parameters.
- c51=
adl
, number of seconds ads played - c52=
noad
, number of individual ads
Note: these parameters are only populated on a D ping following an ad break
Below is an example of a content that was played for 4 minutes with a 28 second ad.
https://secure-dcr-cert.imrworldwide.com/cgi-bin/gn?prd=dcr
Once your app has passed all the test cases and scenarios referenced in this pre-certification checklist, we’re confident that it will also pass Nielsen’s certification process. Upon completion of the checklist, please submit the test results (i.e., monitor logs, worksheet, and test app) to your Nielsen Digital Implementation Manager for certification.
DCR Metadata - AD
Key | Description | Example |
---|---|---|
type | Type of Ad | preroll , midroll , postroll
|
assetid | Unique ID assigned to the ad | XID345-67483 |
Total Content Ratings (TCR) Metadata
Total Content Ratings (TCR)
Total Content Ratings (TCR) provides content measurement on TV and Digital. Bringing together TV and Digital measurement in reporting requires maintaining consistent metadata for your content where it is offered.
DCR
DCR is a key component to measuring viewing on digital platforms. There are a number of DCR metadata keys that are crucial to TCR measurement. The following table provides guidance on the values that are expected to be passed in the required metadata keys that will be used or TCR.
TCR Metadata
Key | Description | Purpose | Example |
---|---|---|---|
program | Program Name | Program name must be identical to program name passed in TV metadata. It is recommended to use the metadata registered in Nielsen TV Names systems (myEVNTS/myVOD). If Nielsen TV Names systems are not used, then you may use the name registered with a 3rd party television listing service. | Big Bang Theory
|
title | Episode Title | Episode name must be identical to episode name passed in TV metadata. It is recommended to use the metadata registered in Nielsen TV Names systems (myEVNTS/myVOD). If Nielsen TV Names systems are not used, then you may use the name registered with a 3rd party television listing service. | Big Bang Theory - S2 - E1 – LF
|
airdate | Airdate | The date the episode was first made available on TV. This value is used as the default episode name when the episode metadata is not available. | YYYY HH:MM:SS (HH =24 hour)
|
isfullepisode | Full Episode Flag | To distinguish between full episodic and non-full episodic content for reporting. Full Episodes are eligible for TCR reporting. A value of "y" should be passed to identify full episodes. |
|
crossId1 | Cross Reference ID1 | Standard Episode ID - The ID should be a unique value for each episode. You can use the episode ID that is registered through Nielsen TV Names systems (myEVNTS/myVOD) or a 3rd party television listing service. (i.e., Gracenote/Tribune ID, Enterprise ID) | gNID123
|
crossId2 | Cross Reference ID2 | Content Originator ID - The ID is used to identify the originator of the content. This value is only required for distributors. Distributors will be provided a listing of content originator IDs from Nielsen that should be passed for secondary crediting. Required for Distributors | ABC
|
Passing Metadata
The required metadata can be passed as key-values through the loadMetadata() method. All values should be passed as strings. The sample code below shows a metadata JSON object for a video and static asset:
Video Asset Example
jsonMetadata={
type: "content",
assetid: "VID345-67483",
isfullepisode: "y",
program: "programName",
title: "Program S3 - EP1",
length: "3600",
segB: "segmentB",
segC: "segmentC",
crossId1: "CS-1",
crossId2: "CS-2",
airdate: "20161013 20:00:00",
adloadtype: "2",
mediaURL: "http://../exampledomain.com",
hasAds: "1"
};
Static Asset Example
jsonMetadata={
type: "static",
assetid: "SID724-38054",
section: "App Section",
segA: "segmentA",
segB: "segmentB",
segC: "segmentC"
};
Ad Asset Example
jsonMetadata={
type: "preroll",
assetid ad: "AD361-84413"
};
Tag Parameters
Parameter | Description | Supplier | Data Type | Value |
---|---|---|---|---|
&ci | Client ID | Nielsen | Static | |
&ch | Channel Asset - Channel Asset is not one to one mapping to content id. One channel asset can have multiple content IDs. | SDK | Dynamic | |
&asn | Site Section/Asset Name | Client | Dynamic | |
&tl | Episode Title | Client | Dynamic | |
&c6 | Sub-Brand | Nielsen | Static | dcr, |
&ca | Content ID - unique ID generated by SDK based on ci, vcid, and the metadata for the Asset ID. | SDK | Dynamic | |
&cg | Program Name | Client | Dynamic | |
&c13 | App ID - A Nielsen ID for player/site/app assigned when onboarding. The client ID and sub-brand values are configured to the App ID. | Nielsen | Static | asid, |
&c32 | Segment A | Client | Dynamic | segA, |
&c33 | Segment B | Client | Dynamic | segB, |
&c34 | Segment C | Client | Dynamic | segC, |
&c15 | App Name | Client | Dynamic | apn, |
&sup | Suppress | SDK | Dynamic | |
&segment2 | Designated Market Area (DMA) | Client/SDK | Dynamic | |
&segment1 | Country Code | Client/SDK | Dynamic | |
&forward | Backend forward flag | SDK | Dynamic | 1 (e.g. forward to Facebook on backend) |
&ad | Access Method | SDK | Static | ad, |
&cr | Segment Code | SDK | Dynamic | crediting ping identifier: 4_00_99_V1_0000 |
&c9 | Advertising ID - IDFA on iOS or Google Advertising ID on Android | SDK | Dynamic | devid, |
&enc | Hash Indicator | SDK | Dynamic | true (e.g. hashed with SHA 256) false (e.g. unhashed) |
&c1 | NUID | SDK | Dynamic | nuid, |
&at | Action Type | SDK | Dynamic | "view" or 'timer' |
&rt | Resource Type | SDK | Dynamic | video (or text if Static) |
&c16 | SDK Version | SDK | Dynamic | sdkv, |
&c27 | Browser/App Duration (in seconds) | SDK | Dynamic | cln, 0 |
&crs | Crash Identifier | SDK | Dynamic | n/a |
&lat | GPS Latitude | SDK | Dynamic | n/a |
&lon | GPS Longitude | SDK | Dynamic | n/a |
&c29 | Player ID | SDK | Dynamic | plid, |
&c30 | Build Version | SDK | Dynamic | bldv, |
&st | Product (Sub-Resource Type) | SDK | Static | dcr |
&c7 | OS Grouping | SDK | Dynamic | osgrp, |
&c8 | Device Grouping | SDK | Dynamic | devgrp, |
&c10 | Platform | SDK | Dynamic | plt, |
&c40 | Adobe ID - Adobe Visitor ID | Client | Dynamic | abide, |
&c14 | OS Version | SDK | Dynamic | over, |
&c26 | GPS Precision | SDK | Dynamic | 3 (Passed in from the host App) 1 (IP Address (v4 or v6)) |
&dd | Reporting Data Date | SDK | Dynamic | (e.g. data date in YYYYMMDD format) |
&hrd | HourCD | SDK | Dynamic | n/a |
&wkd | DayCD | SDK | Dynamic | n/a |
&c35 | Adobe Report Suite ID | Adobe | Dynamic | adrsid, |
&c36 | Cross Reference ID1 | Client | Dynamic | cref1, |
&c37 | Cross Reference ID2 | Client | Dynamic | cref2, |
&c11 | Aggregator | SDK | Dynamic | agg, |
&c12 | App Version | Client | Dynamic | apv, |
&c51 | Total Ad Duration (in secs) | SDK | Dynamic | adl,0 |
&c52 | Number of Ads | SDK | Dynamic | noad,0 |
&sd | Set Duration (length) | Client | Dynamic | |
&devtypid | Device Type | SDK | Dynamic | |
&c53 | isfullepisode flag | Client | Dynamic | fef, |
&c54 | Airdate | Client | Dynamic | oad, |
&c55 | Segment | Client | Dynamic | cref3, |
&c57 | Adloadtype | Client | Dynamic | adldf, |
&c3 | Content/Ad identifier | SDK | Dynamic st,c (content) or st,a (ad) | |
&c64 | Start Time | Client | Dynamic | starttm, |
&c58 | isLive flag | Client | Dynamic | isLive, |
&c59 | Session id | SDK | Dynamic | sesid, |
&c61 | Create Time | SDK | Dynamic | createtm, |
&c63 | pipMode | Client | Dynamic | "true" or "" |
&c62 | Send Time | SDK | Dynamic | sendTime, <1470421076> |
&c68 | Bundle id | SDK | Dynamic | bndlid, |
&c73 | Device Type | SDK | Dynamic | phtype, |
&c74 | Device Name | SDK | Dynamic | dvcnm, |
&c77 | adsuprt | Client | Dynamic | 0=no ads, 1=ads, 2=unknown |
&c71 | OTT flag | SDK | Dynamic | ottflg,<0 (false) or 1 (true)> |
&c72 | OTT type | SDK | Dynamic | otttyp, |
&si | Site Identifier | SDK | Dynamic | n/a |
&c66 | Media URL | Client | Dynamic | |
&vtoff | View Time Offset Adobe | Dynamic | Seconds | offset/back from epoc (will be blank in w/ non batched) |
&rnd | Random Number | SDK | Dynamic | random number (cache buster) |
Nielsen Privacy Page Implementation
1. Complete an opt-out in your app through the Nielsen opt-out webview.
2. User opt-out, a goodbye ping is fired off to the Nielsen server.
Example Goodbye Ping:
&uoo=true
https://secure-dcr-cert.imrworldwide.com/cgi-bin/cfg?cfgv=300
3.Watch any content (static or video) for at least three minutes. You will not see any pings rendering.
4. Opt back in, a hello ping is fired off to the Nielsen server.
Example Hello Ping
&uoo= [blank] or &uoo=false
https://secure-dcr-cert.imrworldwide.com/cgi-bin/cfg?cfgv=300
5. Watch any video content for at least three minutes and you should see V/D pings - view and duration pings.
Your testing is complete for DCR and it's now time to start the app certification process with Nielsen!
Requirements to Start App Certification
The Pre-certification Checklist is a pre-requisite requirement that must be completed with each app being tested. Once testing is complete, provision this same test app build to Nielsen, and send the checklist results, which are the SDK debug logs and monitor sessions (i.e., Charles) per test scenario to your TAM for verification. Please individually-name each session log according to the test scenario performed. Additionally, make sure that all content to be used for testing is CMS enabled, and is consistently available at all times. Any interruptions or intermittence in the flow will cause delays in testing, increased troubleshooting sessions and can prolong the certification process.
- You must enable the Debug flag in the development environment to check whether an AppSDK API call is made successfully in the device log
- To activate the Debug flag, pass the argument @"nol_devDebug":@"XXXXX", in the JSON string for initWithAppInfo, as below. Where "XXXXX" is one of the following:
- 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.
- WARNING: Indicates potential integration / configuration errors or SDK issues.
- ERROR: Indicates important integration errors or non-recoverable SDK issues.
- DEBUG: Debug logs, used by the developers to debug more complex issues.
- To activate the Debug flag, pass the argument @"nol_devDebug":@"XXXXX", in the JSON string for initWithAppInfo, as below. Where "XXXXX" is one of the following:
NSDictionary* appInformation = @{
@ "appid": appID,
@ "appversion" : appVersion,
@ "appname": appName,
@ "sfcode": sfcode,
@ "nol_devDebug": @"INFO"};
NSData* jsonDataAppInfo = [NSJSONSerialization
dataWithJSONObject:appInformation options:0 error:nil];
NSString* jsonStringAppInfo = [[NSString alloc] initWithBytes:
[jsonDataAppInfo bytes] length: [jsonDataAppInfo length]
encoding:NSUTF8StringEncoding];
nlsAppApiMeter = [[NielsenAppApi sharedInstance]
initWithAppInfo:jsonStringAppInfo];
- Once the flag is enabled, it logs each API call made and the data passed. The log created by this flag is minimal.
DO NOT leave the nol_devDebug flag enabled when your app has moved into production!
- Nielsen must receive a production-ready version of your app provisioned to a minimum of 7 Nielsen devices to test on a mixture of devices and operating systems.
Nielsen will provide feedback on all defects found throughout the entire testing and certification process.
Testing Results Worksheet
Questions | Your Results |
---|---|
Record the Test Device ID: | |
What type of App are you testing? Universal Device-type specific App (e.g. Phone, Tablet, iPod, etc.) | |
Devices and OS Tested: | |
Type of content being tested in the app: StaticVideoBoth | |
Is forward/rewind or pause modes available: Please describe. | |
Nielsen Policy Page (Opt-out/Opt-in): | |
Background/Foreground – Same Video: | |
Background/Foreground – Different Video: | |
Channel Change: | |
Interruption – Incoming Call: | |
Interruption – Airport Mode/Wi-Fi: | |
Interruption – Alarm/Sleep: | |
Headphone Removal: | |
Kill and Re-launch: | |
Please list any functions which will need special instructions or any known defects in your app: |
Test Scenarios
Steps to Perform | Record This | Verification Steps | What is this testing? |
---|---|---|---|
Nielsen Privacy Policy: Navigate to Nielsen's "About Nielsen Measurement" page and clicks on Opt-out, then play a video for 10 mins. Navigate back to Nielsen measurement Opt-out page, and Optin. Play same video for 5 mins. |
|
|
|
Background/Foreground – Same Video: Terminate the app and open it from a clean start. Play a video for 5 mins. Stop the video and put the app in the background. Stay in the background for 5 mins. Bring the app to the foreground and play the SAME video again for 5 mins. |
|
|
|
Background/Foreground – Different Video:Terminate the app and open it from a clean start. Play a video for 5 mins. Stop the video and put the app in the background. Stay in the background for 5 mins. Bring the app to the foreground and play a DIFFERENT video for 5 mins |
|
|
|
Video Change: Play Video1 for 3 mins, then switch to Video2 without stopping Video1 and play for 2 mins and stop viewing. |
|
|
|
Interruption – Incoming Call: Stream content for 3 mins. Call the device to create an interruption. Video will stop playing. After 5 mins, resume the video activity for 3 mins. |
|
|
|
Interruption – Airport Mode/Wi-Fi: Stream content for 3 mins. Switch airport mode ON. Video will stop playing after buffering has ended. After 5 mins, turn airplane mode OFF. Resume the video activity for 3 mins. |
|
|
|
Interruption – Alarm/Sleep: Create an alarm or other timed interruption. Stream content until the interruption happens.After 5 mins, resume the video activity for 3 mins. |
|
|
|
Headphone – iOS ONLY: Insert headphone into your iOS device. Stream content for 3 mins and unplug the headphones.Re-insert the headphones. |
|
|
|
Kill and Relaunch: Terminate the app and open it from a fresh start. Play a video for 2 mins. Kill the app while video is playing. Relaunch the app and play any video for 5 mins. |
|
|
|
Obtaining Your Device Identifier
Nielsen will need your device's identifier to distinguish your test data from other devices.
iOS Devices
- You can obtain your device's Advertising Identifier with this app:
- Install and open the app on your Apple device
- From the "Raw" tab, use the "Advertising Identifier"
Android Devices
- Go into "Settings"
- Select "Google"
- Select "Ads"
- Advertising ID is on the bottom under "Your advertising ID:"