Это руководство предназначено для издателей IMA, которые хотят добавить поддержку «картинка в картинке» к существующей реализации IMA.
Предварительные условия
- Заполните руководство по началу работы .
Добавление поддержки «картинка в картинке» в ваше приложение
Начиная с версии SDK 3.1.0, IMA поддерживает режим Apple «Картинка в картинке» для iPad. Чтобы добавить поддержку «Картинка в картинке» в ваше приложение, вам необходимо настроить несколько параметров и реализовать несколько новых классов IMA, как показано ниже.
Обновление настроек для разрешения фонового воспроизведения
Режим «Картинка в картинке» требует, чтобы вы разрешили фоновое воспроизведение мультимедиа в вашем приложении.
Установите для фоновых режимов значение «ВКЛ» для аудио, AirPlay и «Картинка в картинке», как показано ниже:
Установите свойства
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 вставлять рекламу в окно 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
. Этот прокси-объект пересылает все сообщенияAVPictureinPictureControllerDelegate
в ваше приложение, а также перенаправляет вызовы IMA для включения поддержки «картинка в картинке». Обратите внимание, что вы также должны поддерживать локальный дескриптор вашего AVPlayerLayer.