תמיכה בתכונה 'תמונה בתוך תמונה'

‫מודעות מדיה (IMA) SDK ל-iOS.

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

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

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

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

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

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

  1. מגדירים את Background Modes (מצבי רקע) למצב ON (מופעל) עבור Audio, AirPlay and Picture in Picture (אודיו, 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 לתמונה בתוך תמונה

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