Digital Pre-Certification Checklist App SDK

From Engineering Client Portal

Revision as of 20:21, 15 January 2019 by Admin (talk | contribs)

Engineering Portal / Digital / DCR & DTVR / Digital Pre-Certification Checklist App SDK

Note: Due to the variable and unique nature of each application, there may be additional testing required by Nielsen that is not listed here. These tests are completed to ensure the quality of data collected. Please speak with your account manager if you have any questions.

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, no Special Characters)
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:

  1. interruption triggers stop() call
  2. when content resumes, loadMetadata() is called with the same metadata that was playing previously (ad or content)
  3. 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