Este guia destina-se a editores de IMA que querem adicionar suporte a picture-in-picture à implementação atual do IMA.
Pré-requisitos
- Leia o Guia explicativo.
Como adicionar suporte a picture-in-picture ao seu app
A partir da versão 3.1.0 do SDK, o IMA é compatível com o modo picture-in-picture da Apple para iPad. Para adicionar suporte ao modo picture-in-picture ao seu app, é necessário ajustar algumas configurações e implementar algumas novas classes de IMA, conforme mostrado abaixo.
Atualizando as configurações para permitir a reprodução em segundo plano
O modo picture-in-picture exige que você permita a reprodução de mídia em segundo plano no seu app.
Defina os Modos de segundo plano como ATIVADO para Áudio, AirPlay e Picture-in-picture, conforme mostrado abaixo:
Defina as propriedades
AVAudioSession
para oferecer suporte à reprodução em segundo plano e ativar a reprodução em segundo plano emIMASettings
:... – (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; }
Como criar novos objetos iOS e IMA para o picture-in-picture
Para oferecer suporte ao modo picture-in-picture, a Apple adicionou as classes AVPictureInPictureController
e AVPictureinPictureControllerDelegate
. O IMA, por sua parte, adicionou
IMAPictureInPictureProxy
. Para incorporar essas classes ao projeto, adicione
as seguintes instruções ao código:
... @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; }
Modificando sua solicitação de anúncios
Há mais um objeto para criar: IMAAVPlayerVideoDisplay
. Ela é transmitida
ao construtor IMAAdsRequest
e permite que o SDK insira anúncios na janela picture-in-picture
quando o vídeo é reproduzido no modo picture-in-picture:
... - (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]; }
Como iniciar anúncios
Os anúncios do SDK do IMA não podem ser iniciados durante o modo picture-in-picture. Como resultado,
é preciso garantir que você chame [adsManager start]
apenas quando o vídeo estiver no
modo de reprodução padrão:
... - (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; } }
Como entrar no modo picture-in-picture
Se você estiver usando um AVPlayer
sem AVPlayerViewController
, será necessário
adicionar seu próprio botão Picture-in-picture. Implementamos um no nosso Exemplo avançado desta forma:
- (IBAction)onPipButtonClicked:(id)sender {
if ([self.pictureInPictureController isPictureInPictureActive]) {
[self.pictureInPictureController stopPictureInPicture];
} else {
[self.pictureInPictureController startPictureInPicture];
}
}
Perguntas frequentes
- Como faço para iniciar anúncios quando o vídeo está no modo picture-in-picture?
- Os anúncios não podem ser iniciados enquanto o vídeo está no modo picture-in-picture. Eles só podem ser iniciados no modo de reprodução padrão.
- Minha integração Picture-in-picture atual precisa definir
self.pictureInPictureController.delegate
como minha própria classe. Como posso implementar anúncios do IMA em picture-in-picture e ainda ser o delegado? - O SDK do IMA também precisa receber mensagens
AVPictureinPictureControllerDelegate
para ativar a reprodução de anúncios no modo picture-in-picture. É por isso que pedimos que você defina o delegado paraAVPictureinPictureController
como uma instância deIMAPictureInPicturyProxy
. Esse objeto de proxy encaminha todas as mensagensAVPictureinPictureControllerDelegate
para o app, mas também encaminha as chamadas ao IMA para ativar o suporte ao picture-in-picture. Você também precisa manter um handle local para a AVPlayerLayer.