ערכות ה-SDK של IMA מאפשרות לשלב בקלות מודעות מולטימדיה באתרים ובאפליקציות שלכם. ערכות ה-SDK של IMA יכולות לבקש מודעות מכל שרת מודעות שתואם ל-VAST ולנהל את ההפעלה של המודעות באפליקציות. באמצעות ערכות ה-SDK של IMA DAI, האפליקציות שולחות בקשה לשידור של מודעת וידאו ותוכן וידאו – VOD או תוכן בשידור חי. לאחר מכן, ה-SDK מחזיר שידור וידאו משולב, כך שלא תצטרכו לנהל את המעבר בין סרטון המודעה לסרטון התוכן באפליקציה.
בחירת פתרון ה-DAI הרצוי
מודעות דינמיות ב-Pod
המדריך הזה מראה איך להפעיל שידור חי או VOD של מודעות דינמיות (DAI) באמצעות IMA DAI SDK ל-tvOS עם נגן וידאו. כדי להציג או לפעול לפי דוגמה לשילוב שהושלם, אפשר להוריד את אפליקציית הדוגמה של Pod Serving (ב-Obj C או ב-Swift).
סקירה כללית על הצגת מודעות ב-IMA DAI Pod
כדי להטמיע הצגת מודעות ברצף באמצעות IMA DAI SDK ל-tvOS, צריך שני רכיבים עיקריים:
StreamRequest
: אובייקט שמגדיר בקשת סטרימינג לשרתים של Google לפרסום. כדי להפעיל את Pod Serving, צריך ליצור אותו באמצעותIMAPodStreamRequest
אוIMAPodVODStreamRequest
. בשתי השיטות נדרשים קוד רשת, וגם ב-IMAPodStreamRequest
נדרש מפתח נכס מותאם אישית. מפתח API הוא אופציונלי.IMAStreamManager
: אובייקט שמטפל בתקשורת בין מקור הווידאו ל-IMA DAI SDK, למשל הפעלת פינגים למעקב והעברת אירועי מקור לבעלים של האתר.
דרישות מוקדמות
לפני שמתחילים, צריך את הדברים הבאים:
- Xcode מגרסה 13 ואילך.
- CocoaPods (מומלץ), Swift Package Manager או עותק שהורדתם של IMA DAI SDK for tvOS.
- אפליקציית tvOS שכבר מוגדרת עם IMA DAI SDK כדי להפעיל שידורי וידאו עם מודעות DAI. אם עדיין אין לכם אפליקציה כזו, מומלץ להשתמש ב-tvOS DAI BasicExample כנקודת התחלה. ב-BasicExample יש את קוד המקור שמוזכר במדריך הזה. מידע נוסף על הטמעת IMA DAI SDK זמין במדריך למתחילים.
הגדרת משתני ההצגה של Pod
כל השינויים הנדרשים להצגת Pod מתבצעים ב-ViewController.swift
ב-Swift או ב-ViewController.m
ב-Objective-C. ברירת המחדל של קטעי הקוד במדריך הזה היא שימוש בשפת Swift. השלב הראשון הוא לעדכן את המשתנים הקבועים.
אלה הקבועים של בקשות הסטרימינג של רצפי המודעות שצריך להוסיף:
STREAM_URL
(משמש רק לשידורים חיים): כתובת ה-URL של סטרימינג הווידאו שסופקה על ידי הגורם שמשתמש ב-Manifest או על ידי שותף צד שלישי באמצעות הצגת מודעות ברצף. לפני שליחת הבקשה, צריך להזין את מזהה הסטרימינג שסופק על ידי IMA DAI SDK. במקרה כזה, כתובת ה-URL של הסטרימינג כוללת placeholder,"[[STREAMID]]"
, שתוחלף במזהה הסטרימינג לפני שליחת הבקשה.NETWORK_CODE
: קוד הרשת של חשבון Ad Manager 360.CUSTOM_ASSET_KEY
(משמש רק בשידורים חיים): מפתח הנכס בהתאמה אישית שמזהה את אירוע הצגת המודעות של הפודקאסט ב-Ad Manager 360. אפשר ליצור אותו באמצעות הכלי לעיבוד המניפסט או דרך שותף צד שלישי להצגת מודעות ב-Pod.API_KEY
(משמש רק לשידורים חיים): מפתח API אופציונלי שעשוי להידרש כדי לאחזר מזהה של שידור מ-IMA DAI SDK.
משנים את הקטע של המשתנה בדוגמה כך שיתאים לקוד הבא:
...
class ViewController:
UIViewController,
IMAAdsLoaderDelegate,
IMAStreamManagerDelegate,
AVPlayerViewControllerDelegate
{
static let streamUrl =
"https://encodersim.sandbox.google.com/masterPlaylist/9c654d63-5373-4673-8c8d-6d92b66b9d46/master.m3u8?gen-seg-redirect=true&network=51636543&event=google-sample&pids=devrel4628000,devrel896000,devrel3528000,devrel1428000,devrel2628000,devrel1928000&seg-host=dai.google.com&stream_id=[[STREAMID]]"
static let networkCode = "51636543"
static let customAssetKey = "google-sample"
static let APIKey = ""
static let backupStreamURLString =
"http://googleimadev-vh.akamaihd.net/i/big_buck_bunny/bbb-,480p,720p,1080p,.mov.csmil/master.m3u8"
var adsLoader: IMAAdsLoader?
...
יצירת בקשה לשידור של פודקאסט בשידור חי או ב-VOD
כדי ליצור בקשה לשידור חי של פוד, משנים את השיטה requestStream
על ידי יצירה של IMAPodStreamRequest
.
...
func requestStream() {
guard let playerViewController = self.playerViewController else return
guard let adContainerView = self.adContainerView else return
guard let adsLoader = self.adsLoader else return
self.videoDisplay = IMAAVPlayerVideoDisplay(avPlayer: playerViewController.player)
adDisplayContainer = IMAAdDisplayContainer(
adContainer: adContainerView, viewController: self)
// Create a podserving stream request.
request = IMAPodStreamRequest(
networkCode: self.networkCode,
customAssetKey: self.customAssetKey,
adDisplayContainer: adDisplayContainer,
videoDisplay: self.videoDisplay,
userContext: nil)
adsLoader.requestStream(with: request)
}
...
משנים את השיטה requestStream
כדי ליצור בקשה להעברת נתונים של רצף VOD, על ידי יצירה של IMAPodVODStreamRequest
.
...
func requestStream() {
guard let playerViewController = self.playerViewController else return
guard let adContainerView = self.adContainerView else return
guard let adsLoader = self.adsLoader else return
self.videoDisplay = IMAAVPlayerVideoDisplay(avPlayer: playerViewController.player)
adDisplayContainer = IMAAdDisplayContainer(
adContainer: adContainerView, viewController: self)
// Create a podserving stream request.
request = IMAPodVODStreamRequest(
networkCode: self.networkCode,
adDisplayContainer: adDisplayContainer,
videoDisplay: self.videoDisplay,
userContext: nil)
adsLoader.requestStream(with: request)
}
...
עריכה והגדרה של כתובת ה-URL של מקור הנתונים
משנים את השיטות של IMAAdsLoaderDelegate
, ומשתמשים ב-streamManager.streamId
כדי לקבל את מזהה המקור. לאחר מכן, מזינים את מזהה הסטרימינג ב-STREAM_URL
, במקום "[[STREAMID]]"
. אחרי ביצוע השינוי הזה, אפשר להגדיר את כתובת ה-URL החדשה של השידור באמצעות videoDisplay.loadStream()
.
...
// MARK: - IMAAdsLoaderDelegate
func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) {
let streamManager = adsLoadedData.streamManager
let streamId = streamManager.streamId
let urlString = streamUrl.replacingOccurrences(of: "[[STREAMID]]", with: streamId)
let loadedStreamUrl = URL(string:urlString)
self.videoDisplay.loadStream(loadedStreamUrl, subtitles:@[])
self.videoDisplay.play()
streamManager.delegate = self
streamManager.initialize(with: nil)
self.streamManager = streamManager
}
...
משנים את השיטות של IMAAdsLoaderDelegate
, ומשתמשים ב-streamManager.streamId
כדי לקבל את מזהה המקור. לאחר מכן, מבקשים כתובת URL של סטרימינג משותף הטכנולוגיה של הווידאו (VTP) ומפעילים את IMAStreamManager.loadThirdPartyStream()
כדי ש-IMA יטען את כתובת ה-URL של הסטרימינג ואת כל הכתוביות שהוחזרו על ידי ה-TVP.
...
// MARK: - IMAAdsLoaderDelegate
func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) {
let streamManager = adsLoadedData.streamManager
let streamId = streamManager.streamId
// 'vtpInterface' is a place holder for your own video technology partner
// (VTP) API calls.
let streamUrl = vtpInterface.requestStreamURL(streamID)
self.streamManager.loadThirdPartyStream(streamUrl, streamSubtitles:@[])
streamManager.delegate = self
streamManager.initialize(with: nil)
self.streamManager = streamManager
}
ניקוי נכסי IMA DAI
אחרי שמשלימים את הבקשה להצגת מודעות בסטרימינג של Pod Serving באמצעות IMA DAI SDK, מומלץ לנקות את המשאבים בסיום הסשן של הצגת המודעות ב-Pod. קוראים לפונקציה IMAStreamManager.destroy()
כדי להפסיק את ההפעלה של הסטרימינג, להפסיק את כל המעקב אחר מודעות ולשחרר את כל נכסי הסטרימינג שנטענו.
דוגמאות נוספות לשימוש ב-tvOS SDK זמינות בדוגמאות ב-GitHub.