Поддержка картинка в картинке

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

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

Предварительные требования

Добавление поддержки режима «картинка в картинке» в ваше приложение

Начиная с версии SDK 3.1.0, 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 . Он передается в конструктор 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 в режиме «Картинка в картинке», оставаясь при этом в роли делегата?
Для включения воспроизведения рекламы в режиме «картинка в картинке» SDK IMA также необходимо получать сообщения AVPictureinPictureControllerDelegate . Именно поэтому мы просим вас установить делегат для AVPictureinPictureController в экземпляр IMAPictureInPicturyProxy . Этот прокси-объект пересылает все сообщения AVPictureinPictureControllerDelegate вашему приложению, а также перенаправляет вызовы в IMA для включения поддержки режима «картинка в картинке». Обратите внимание, что вам также необходимо поддерживать локальный дескриптор вашего AVPlayerLayer.