Как добавить поддержку режима "Картинка в картинке"

SDK медиарекламы (IMA) для iOS.

Это руководство предназначено для издателей, которые используют IMA и хотят добавить поддержку режима "картинка в картинке" в существующую реализацию IMA.

Требования

Как добавить в приложение поддержку режима "Картинка в картинке"

Начиная с версии 3.1.0, IMA SDK поддерживает режим "Картинка в картинке" от Apple для iPad. Чтобы добавить в приложение поддержку режима "Картинка в картинке", вам нужно изменить несколько настроек и реализовать несколько новых классов 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 для режима "картинка в картинке"

Для поддержки режима "Картинка в картинке" компания 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. Этот объект-посредник пересылает все сообщения AVPictureinPictureControllerDelegate в ваше приложение, а также пересылает вызовы в IMA, чтобы включить поддержку режима "Картинка в картинке". Обратите внимание, что вам также необходимо поддерживать локальный дескриптор для AVPlayerLayer.