תמונה בתוך תמונה

המדריך הזה מיועד ליצרני תוכן של IMA שרוצים להוסיף תמיכה ב'תמונה בתוך תמונה' להטמעה הקיימת של ה-IMA.

דרישות מוקדמות

הוספת תמיכה ב'תמונה בתוך תמונה' לאפליקציה

החל מגרסה 3.1.0 של ה-SDK, התכונה 'תמונה בתוך תמונה' של Apple תומכת ב-iPad. כדי להוסיף לאפליקציה תמיכה ב'תמונה בתוך תמונה', צריך לשנות כמה הגדרות ולהוסיף כמה מחלקות IMA חדשות, כמו שמתואר בהמשך.

מתבצע עדכון של ההגדרות כדי לאפשר הפעלה ברקע

מצב 'תמונה בתוך תמונה' מחייב אתכם לאפשר הפעלה של מדיה ברקע באפליקציה.

  1. מצבי רקע מוגדרים כמופעלים עבור אודיו, AirPlay ו'תמונה בתוך תמונה' כפי שמוצג כאן:

  2. מגדירים את המאפיינים של 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 במצב 'תמונה בתוך תמונה'

כדי לתמוך בתכונה 'תמונה בתוך תמונה', Apple הוסיפה את המחלקות 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 להוסיף מודעות לחלון 'תמונה בתוך תמונה' כאשר הסרטון פועל במצב 'תמונה בתוך תמונה':

...
- (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 הזה מעביר לאפליקציה את כל ההודעות של AVPictureinPictureControllerDelegate, אבל גם מעביר את הקריאות ל-IMA כדי להפעיל תמיכה ב'תמונה בתוך תמונה'. שימו לב שצריך גם לשמור על כינוי מקומי ל-AVPlayerLayer.