Digital Pre-Certification Checklist App SDK: Difference between revisions
From Engineering Client Portal
(Created page with "== Pre-certification Checklist - VOD with Ads == Before starting the certification process, please verify the following steps have been completed. * Your Client Service repres...") |
(Does not need to be fired before every playhead position update, this will cause the SDK to not credit any seconds of viewing.) |
||
| Line 105: | Line 105: | ||
=== loadMetadata() - ad === | === loadMetadata() - ad === | ||
* Called at beginning of ad, or when resuming ad from interruption | * Called at beginning of ad, or when resuming ad from interruption | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
Revision as of 17:47, 12 September 2017
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 | PXXXXX-XXXXXX-XXXXX-XXXXX
|
| appname | example app name
|
| appversion | 2.0
|
| nol_devDebug | debug
|
iOS Example
NSDictionary* appInformation = @
{ // AppID is Nielsen-supplied
@"appid": @"PXXXXXXXX-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", "PXXXXXXXX-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
- Fires before any playheadPosition update
| 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 |