Engineering Portal / Digital / DCR & DTVR / Digital Pre-Certification Checklist App SDK
Pre-certification Checklist - VOD with Ads
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 |
|