SDK de Anúncios de Mídia (IMA) para iOS.
Este guia é destinado a publishers do IMA que querem adicionar suporte ao modo picture-in-picture à implementação atual do IMA.
Pré-requisitos
- Leia o guia para iniciantes.
Como adicionar suporte ao modo picture-in-picture ao app
A partir da versão 3.1.0 do SDK, o IMA oferece suporte ao modo picture-in-picture da Apple para iPad. Para adicionar suporte ao modo picture-in-picture ao app, é necessário ajustar algumas configurações e implementar algumas novas classes do IMA, conforme mostrado abaixo.
Como atualizar 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 app.
Defina Modos em segundo plano como ATIVADO para Áudio, AirPlay e Picture in Picture , conforme mostrado abaixo:

Defina as propriedades
AVAudioSessionpara oferecer suporte à reprodução em segundo plano e ative 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 do iOS e do IMA para o modo picture-in-picture
Para oferecer suporte ao modo picture-in-picture, a Apple adicionou as classes AVPictureInPictureController e AVPictureinPictureControllerDelegate. O IMA, por sua vez, adicionou IMAPictureInPictureProxy. Para incorporar essas classes ao projeto, adicione as instruções a seguir 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; }
Como modificar a solicitação de anúncios
Há mais um novo objeto a ser criado: IMAAVPlayerVideoDisplay. Ele é transmitido ao construtor IMAAdsRequest e permite que o SDK insira anúncios na janela do modo picture-in-picture quando o vídeo estiver sendo reproduzido nesse modo:
... - (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 no modo picture-in-picture. Como resultado, é necessário garantir que você só chame [adsManager start] 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 um AVPlayerViewController, será necessário
adicionar seu próprio botão picture-in-picture. Implementamos um no nosso avançado
exemplo
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?
- Não é possível iniciar anúncios 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 atual do modo picture-in-picture precisa definir
self.pictureInPictureController.delegatepara minha própria classe. Como posso implementar anúncios do IMA no modo picture-in-picture e ainda ser o delegado? - O SDK do IMA também precisa receber mensagens
AVPictureinPictureControllerDelegatepara ativar a reprodução de anúncios no modo picture-in-picture. Por isso, pedimos que você defina o delegado deAVPictureinPictureControllerpara uma instância deIMAPictureInPicturyProxy. Esse objeto proxy encaminha todas as mensagensAVPictureinPictureControllerDelegatepara o app, mas também encaminha as chamadas para o IMA para ativar o suporte ao modo picture-in-picture. Você também precisa manter um identificador local para o AVPlayerLayer.