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

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 в режиме «Картинка в картинке», оставаясь при этом в роли делегата?
The IMA SDK also needs to receive AVPictureinPictureControllerDelegate messages to enable ad playback in Picture in Picture mode. This is why we ask you to set the delegate for AVPictureinPictureController to an instance of IMAPictureInPicturyProxy . This proxy object forwards on all AVPictureinPictureControllerDelegate messages to your app, but also forwards the calls to IMA to enable Picture in Picture support. Note that you must also maintain a local handle to your AVPlayerLayer.