Media Ads (IMA) SDK ל-iOS.
המדריך הזה מיועד לבעלי אפליקציות שמשתמשים ב-IMA ורוצים להוסיף תמיכה בתכונה 'תמונה בתוך תמונה' להטמעה הקיימת של IMA.
דרישות מוקדמות
- ממלאים את המדריך לתחילת העבודה.
הוספת תמיכה בתכונה 'תמונה בתוך תמונה' לאפליקציה
החל מגרסה 3.1.0 של IMA SDK, IMA תומך במצב 'תמונה בתוך תמונה' של Apple באייפד. כדי להוסיף תמיכה בתכונה 'תמונה בתוך תמונה' לאפליקציה, צריך לשנות כמה הגדרות ולהטמיע כמה מחלקות חדשות של IMA, כמו שמוצג בהמשך.
עדכון ההגדרות כדי לאפשר הפעלה ברקע
כדי להשתמש במצב תמונה בתוך תמונה, צריך לאפשר הפעלת מדיה ברקע באפליקציה.
מגדירים את מצבי רקע למצב מופעל עבור אודיו, AirPlay ותמונה בתוך תמונה, כמו שמוצג בהמשך:
מגדירים את המאפיינים
AVAudioSession
כדי לתמוך בהפעלה ברקע, וגם מפעילים את ההפעלה ברקע ב-IMASettings
:... – (void)viewDidLoad { [super viewDidLoad]; self.playButton.layer.zPosition = MAXFLOAT; [[AVAudioSession sharedInstance] setActive:YES error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [self setupAdsLoader]; [self setUpContentPlayer]; } – (void)setupAdsLoader { IMASettings *settings = [[IMASettings alloc] init]; settings.enableBackgroundPlayback = YES; self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:settings]; self.adsLoader.delegate = self; }
יצירת אובייקטים חדשים של iOS ו-IMA לתמונה בתוך תמונה
כדי לתמוך בתמונה בתוך תמונה, אפל הוסיפה את המחלקות AVPictureInPictureController
ו-AVPictureinPictureControllerDelegate
. ב-IMA נוסף IMAPictureInPictureProxy
. כדי לשלב את המחלקות האלה בפרויקט, מוסיפים את ההצהרות הבאות לקוד:
... @interface VideoViewController () <AVPictureInPictureControllerDelegate, IMAAdsLoaderDelegate, IMAAdsManagerDelegate, UIAlertViewDelegate> ... // PiP objects. @property(nonatomic, strong) IMAPictureInPictureProxy *pictureInPictureProxy; @property(nonatomic, strong) AVPictureInPictureController *pictureInPictureController; ... @end - (void)setUpContentPlayer { ... self.pictureInPictureProxy = [[IMAPictureInPictureProxy alloc] initWithAVPictureInPictureControllerDelegate:self]; self.pictureInPictureController = [[AVPictureInPictureController alloc] initWithPlayerLayer:self.contentPlayerLayer]; self.pictureInPictureController.delegate = self.pictureInPictureProxy; }
שינוי הבקשה להצגת מודעות
יש עוד אובייקט חדש אחד ליצור: IMAAVPlayerVideoDisplay
. הערך הזה מועבר לקונסטרוקטור IMAAdsRequest
ומאפשר ל-SDK להוסיף מודעות לחלון PiP כשהסרטון פועל במצב 'תמונה בתוך תמונה':
... - (void)requestAdsWithTag:(NSString *)adTagUrl { [self logMessage:@"Requesting ads"]; // Create an ad request with our ad tag, display container, and optional user context. IMAAdsRequest *request = [[IMAAdsRequest alloc] initWithAdTagUrl:adTagUrl adDisplayContainer:[self createAdDisplayContainer] avPlayerVideoDisplay:[[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.contentPlayer] pictureInPictureProxy:self.pictureInPictureProxy userContext:nil]; [self.adsLoader requestAdsWithRequest:request]; }
הפעלת מודעות
אי אפשר להפעיל מודעות ב-IMA SDK במצב 'תמונה בתוך תמונה'. לכן, צריך לוודא שמתקשרים אל [adsManager start]
רק כשהסרטון נמצא במצב הפעלה רגיל:
... - (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event { [self logMessage:@"AdsManager event (%s).", AdEventNames[event.type]]; // When the SDK notified you that ads have been loaded, play them. switch (event.type) { case kIMAAdEvent_LOADED: if (![self.pictureInPictureController isPictureInPictureActive]) { [adsManager start]; } break; ... default: break; } }
מעבר למצב תמונה בתוך תמונה
אם אתם משתמשים ב-AVPlayer
בלי AVPlayerViewController
, אתם צריכים להוסיף לחצן משלכם להצגת תמונה בתוך תמונה. הטמענו אחת כזו בדוגמה המתקדמת שלנו באופן הבא:
- (IBAction)onPipButtonClicked:(id)sender {
if ([self.pictureInPictureController isPictureInPictureActive]) {
[self.pictureInPictureController stopPictureInPicture];
} else {
[self.pictureInPictureController startPictureInPicture];
}
}
שאלות נפוצות
- איך מפעילים מודעות כשהסרטון במצב 'תמונה בתוך תמונה'?
- אי אפשר להפעיל מודעות כשהסרטון במצב 'תמונה בתוך תמונה'. אפשר להפעיל אותן רק במצב הפעלה רגיל.
- השילוב הקיים של תמונה בתוך תמונה צריך להגדיר את
self.pictureInPictureController.delegate
לכיתה שלי. איך אפשר להטמיע מודעות IMA בתכונה 'תמונה בתוך תמונה' ועדיין להיות הנציג? - בנוסף, IMA SDK צריך לקבל הודעות כדי להפעיל את הצגת המודעות במצב 'תמונה בתוך תמונה'.
AVPictureinPictureControllerDelegate
לכן אנחנו מבקשים ממך להגדיר את הנציג שלAVPictureinPictureController
למופע שלIMAPictureInPicturyProxy
. אובייקט ה-proxy הזה מעביר את כל ההודעות לאפליקציה, אבל גם מעביר את הקריאות ל-IMA כדי להפעיל תמיכה בתכונת 'תמונה בתוך תמונה'.AVPictureinPictureControllerDelegate
חשוב לזכור שצריך גם לשמור על ידית מקומית ל-AVPlayerLayer.