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

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

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

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

החל מגרסה 3.1.0 של ה-SDK, ב-IMA יש תמיכה במצב 'תמונה בתוך תמונה' של 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. הערך הזה מועבר ל-constructor של 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 במצב 'תמונה בתוך תמונה' ועדיין להיות עם הרשאות גישה?
כדי לאפשר הפעלה של מודעות במצב 'תמונה בתוך תמונה', AVPictureinPictureControllerDelegateגם צריך לקבל הודעות מ-IMA SDK. לכן אנחנו מבקשים להגדיר את הגוף המורשה של AVPictureinPictureController למכונה של IMAPictureInPicturyProxy. אובייקט ה-Proxy הזה מעביר בכל מקום AVPictureinPictureControllerDelegate הודעות לאפליקציה, אבל גם מועברות הקריאות ל-IMA להפעיל תמיכה ב'תמונה בתוך תמונה'. חשוב לזכור שצריך גם לשמור על אחיזה מקומית ב-AVPlayerLayer.