Engineering Portal / Digital / DCR & DTVR   /  Digital Pre-Certification Checklist App SDK 
Pre-certification Checklist
Before starting the certification process, please verify the following steps have been completed.
- Your Client Service representative should have already discussed a reporting hierarchy with you -- along with a Parent, Brand, and Sub-brand/Channel
 
- Your Technical Account Manager should have:
- provided you with an AppID
 
- informed you of our Opt-Out requirement for your App/Play Store description
 
- informed you of our Opt-Out requirement for a WebView inside your apps
 
 
- Retrieving AppSDK logs
- 'nol_devDebug' : 'DEBUG' should be present in initialization call (see below)
 
- Android: use adb logcat (note: requires Android Studio)
 
- iOS: idevicesyslog (note: requires XCode)
 
 
Initialization
The first step in the Certification process is to ensure that the Nielsen SDK is initializing at app startup, and that the global metadata values are present.
| Keys | 
Value
 | 
| appid | 
XXXXX-XXXXXX-XXXXX-XXXXX
 | 
| appname | 
example app name
 | 
| appversion | 
2.0
 | 
| nol_devDebug | 
debug
 | 
iOS Example
NSDictionary* appInformation = @
{ // AppID is Nielsen-supplied
	 @"appid": @"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
 	 @"appname": @"Sample App Name",
 	 @"appversion": @"2.0",
 	 @"nol_devDebug": @"DEBUG" // required for testing only
}
 
Android Example
JSONObject appSdkConfig = new JSONObject()
          .put("appid", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
          .put("appname", "Sample App Name")
          .put("appversion","2.0")
          .put("nol_devDebug”, "DEBUG"); // required for testing only
// Pass appSdkConfig to the AppSdk constructor
mAppSdk = new AppSdk(appContext, appSdkConfig, appSdkListener);
 
Test Cases
The following lists the test cases along with the Expected results:
| Test Case | 
Param | 
Expected Result | 
Pass/Fail
 | 
| SDK Initialized | 
appid | 
Correct app id | 
 | 
 | 
appname | 
Player name | 
 | 
 | 
appversion | 
Correct build | 
 | 
 | 
nol_devDebug | 
'DEBUG' | 
 | 
play()
- The 
play() call is required only once per viewing session (until app is killed) 
- Called just before playback commences for first piece of content
 
| Test Case | 
Param | 
Expected Result | 
Pass/Fail
 | 
| Play | 
channelname | 
Name of Channel | 
 | 
loadMetadata() - Content
- Called at beginning of content, or when resuming content from interruption
 
| Test | 
Param | 
Example Value | 
Accepted Values | 
Pass/Fail
 | 
| loadMetadata | 
type | 
"content" | 
"content" | 
 | 
 | 
assetid | 
"unique_id_500291" | 
(unique per asset) | 
 | 
 | 
length | 
"600" | 
length in seconds (int or float) | 
 | 
 | 
title | 
"Episode Title" | 
(any non-empty value) | 
 | 
 | 
program | 
"Show Name" | 
(any non-empty value) | 
 | 
 | 
segB | 
"Primetime" | 
(any value), used for optional breakdown | 
 | 
 | 
segC | 
"Comedy" | 
(any value), used for optional breakdown | 
 | 
 | 
crossId1 | 
"EP018S9S290015" | 
Gracenote ID | 
 | 
 | 
crossId2 | 
"ABC" | 
Network Name | 
 | 
 | 
isfullepisode | 
"y" | 
("y" or "n") ("Y" or "N") | 
 | 
 | 
airdate | 
"20160206 23:00:00 | 
"YYYYMMDD[space]HH:MM:SS" -- note: HH=24 hour time | 
 | 
 | 
adloadtype | 
"1" | 
"1" for linear ads, "2" for DAI | 
 | 
 | 
hasAds | 
"1" | 
"0" for no ads, "1" for has ads | 
 | 
loadMetadata() - ad
- Called at beginning of ad, or when resuming ad from interruption
 
| Test | 
Param | 
Example Value | 
Accepted Values | 
Pass/Fail
 | 
| loadMetadata | 
assetid | 
"ad_2201343201" | 
(any non-empty value) | 
 | 
 | 
type | 
"midroll" | 
"preroll", "midroll", "postroll" | 
Example
 | 
setPlayheadPosition() - Preroll ad
- Track current position of playhead
 
- Starts at 0 at the beginning of ad
 
- Updated at least once per second
 
- Separate playhead position for ads and content, should accurately reflect current position in either ads or content
 
- Final playhead position for content must equal the length specified in loadMetadata(), followed by end() call
 
| Test Case | 
Test Condition | 
Pass/Fail
 | 
setPlayehadPosition | 
Called every second | 
 | 
stop() | 
Called at the end of Ad | 
 | 
loadMetadata() - Content
- Test is to validate Content metadata is the same as original metadata passed during initial loadMetadata call.
 
| Test | 
Param | 
Example Value | 
Accepted Values | 
Pass/Fail
 | 
| loadMetadata | 
type | 
"content" | 
"content" | 
 | 
 | 
assetid | 
"unique_id_500291" | 
(unique per asset) | 
 | 
 | 
length | 
"600" | 
length in seconds (int or float) | 
 | 
 | 
title | 
"Episode Title" | 
(any non-empty value) | 
 | 
 | 
program | 
"Show Name" | 
(any non-empty value) | 
 | 
 | 
segB | 
"Primetime" | 
(any value), used for optional breakdown | 
 | 
 | 
segC | 
"Comedy" | 
(any value), used for optional breakdown | 
 | 
 | 
crossId1 | 
"EP018S9S290015" | 
Gracenote ID | 
 | 
 | 
crossId2 | 
"ABC" | 
Network Name | 
 | 
 | 
isfullepisode | 
"y" | 
("y" or "n") ("Y" or "N") | 
 | 
 | 
airdate | 
"20160206 23:00:00 | 
"YYYYMMDD[space]HH:MM:SS" -- note: HH=24 hour time | 
 | 
 | 
adloadtype | 
"1" | 
"1" for linear ads, "2" for DAI | 
 | 
 | 
hasAds | 
"1" | 
"0" for no ads, "1" for has ads | 
 | 
setPlayheadPosition() - Content
- Track current position of playhead
 
- Starts at 0 at the beginning of content
 
- Updated at least once per second
 
- Separate playhead position for ads and content, should accurately reflect current position in either ads or content
 
- Final playhead position for content must equal the length specified in loadMetadata(), followed by end() call
 
| Test Case | 
Test Condition | 
Pass/Fail
 | 
setPlayehadPosition | 
Called every second | 
 | 
stop() | 
Called at the end of Content | 
 | 
stop()
- Indicates one of the following:
 
- Playback of content or ad was interrupted
 
- Reached end of ad (no parameters or metadata)
 
end()
- Reached the end of content (no parameters or metadata)
 
Interruptions
- All interruptions to playback of content or ads should trigger a call to stop(). Once the interruption is over, loadMetadata() with the same metadata should be called, followed by playheadPosition resuming from where it left off.
 
- Interruptions include:
- user-induced pause
 
- screen turned off
 
- app sent to background
 
- headphones removed (note, if app simply switches audio output from headphones to speaker without pausing, there is no need to call stop())
 
- alarm/call interruption
 
- internet connection lost (n.b. cached playback plays as normal until it expires)
 
 
| Test Case | 
Test Condition | 
Pass/Fail
 | 
| user-induced pause | 
stop(), loadMetadata() & playheadPosition | 
 | 
| screen turned off | 
stop(), loadMetadata() & playheadPosition | 
 | 
| app sent to background | 
stop(), loadMetadata() & playheadPosition | 
 | 
| headphones removed | 
stop(), loadMetadata() & playheadPosition | 
 | 
| alarm/call interruption | 
stop(), loadMetadata() & playheadPosition | 
 | 
| internet connection lost | 
stop(), loadMetadata() & playheadPosition | 
 | 
| content paused | 
playheadPosition is not passed | 
 | 
| resume content | 
loadMetadata() is called for content | 
 | 
 | 
loadMetadataM is the same as original | 
 | 
 | 
playheadPosition continues from resumed position | 
 | 
Expected SDK behavior for all interruptions:
- interruption triggers stop() call
 
- when content resumes, loadMetadata() is called with the same metadata that was playing previously (ad or content)
 
- playheadPosition() resumes from the same position before the interruption
 
Example session:
- 5 minutes of content played, call interruption, content resumes until end of 15 min video
 
Scrubbing
| Test Case | 
Test Condition | 
Pass/Fail
 | 
| Scrub Backward | 
new playhead position is accurate | 
 | 
 | 
new playhead continues from new position | 
 | 
| Scrub Forward | 
new playhead position is accurate | 
 | 
 | 
new playhead continues from new position | 
 | 
| Scrub to end | 
final playhead position is passed | 
 | 
 | 
end event called at completion of content playback | 
 | 
| Scrub past midroll | 
Playhead for content stops | 
 | 
Midroll & Postroll Ads
| Test Case | 
Test Condition | 
Pass/Fail
 | 
loadMetadata() | 
Called for each Ad | 
 | 
 | 
Required Metadata is accurate | 
 | 
playheadPosition | 
Passed every second | 
 | 
stop() | 
called for each ad | 
 | 
loadMetadata(), playheadPosition, stop() | 
correct sequence for each ad | 
 | 
Opt-Out
Users must have access to "About Nielsen Measurement" page. User can click this page from app settings screen.
- URL to this web page should be called from SDK by invoking optOutURL and opened in 'WebView' / External browser.
 
- If the App SDK returns NULL as Opt-Out URL, handle the exception gracefully and retry later.
 
- To retrieve the current Opt-Out status of a device, use the optOutStatus method.
 
| Test Case | 
Test Condition | 
Pass/Fail
 | 
optOutView | 
User can Opt-Out | 
 |