SDK do Interactive Media Ads (IMA) para iOS.
Este guia é destinado a editores da IMA que querem adicionar suporte a picture-in-picture à implementação atual da IMA.
Pré-requisitos
- Conclua o guia para iniciantes.
Adicionar suporte a picture-in-picture ao app
A partir da versão 3.1.0 do SDK, a IMA é compatível com o modo picture-in-picture da Apple para iPad. Para adicionar suporte a picture-in-picture no seu app, é necessário ajustar algumas configurações e implementar algumas novas classes da IMA, conforme mostrado abaixo.
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
AVAudioSession
para oferecer suporte à reprodução em segundo plano e ative esse recurso 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 da IMA para picture-in-picture
Para oferecer suporte ao Picture in Picture, a Apple adicionou as classes AVPictureInPictureController
e AVPictureinPictureControllerDelegate
. A IMA, por sua vez, 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; }
Como modificar sua solicitação de anúncio
Há mais um novo objeto a ser criado: IMAAVPlayerVideoDisplay
. Isso é transmitido
ao seu construtor IMAAdsRequest
e permite que o SDK insira anúncios na janela
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]; }
Começar a veicular anúncios
Os anúncios do SDK do IMA não podem ser iniciados no modo picture-in-picture. Por isso,
você precisa garantir que só vai chamar [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
, adicione seu próprio botão picture-in-picture. Implementamos um no nosso Exemplo
avançado
assim:
- (IBAction)onPipButtonClicked:(id)sender {
if ([self.pictureInPictureController isPictureInPictureActive]) {
[self.pictureInPictureController stopPictureInPicture];
} else {
[self.pictureInPictureController startPictureInPicture];
}
}
Perguntas frequentes
- Como faço para iniciar os 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
para minha própria classe. Como posso implementar anúncios da IMA no 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, pedimos que você defina o delegado deAVPictureinPictureController
como uma instância deIMAPictureInPicturyProxy
. Esse objeto proxy encaminha todas as mensagensAVPictureinPictureControllerDelegate
para seu app, mas também encaminha as chamadas para a IMA e ativa o suporte a picture-in-picture. Também é necessário manter um identificador local para o AVPlayerLayer.