Oferecer suporte ao picture-in-picture

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

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.

  1. Defina Modos em segundo plano como ATIVADO para Áudio, AirPlay e Picture in Picture , conforme mostrado abaixo:

  2. Defina as propriedades AVAudioSession para oferecer suporte à reprodução em segundo plano e ative a reprodução em segundo plano em 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;
    }

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.delegate para 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 AVPictureinPictureControllerDelegate para ativar a reprodução de anúncios no modo picture-in-picture. Por isso, pedimos que você defina o delegado de AVPictureinPictureController para uma instância de IMAPictureInPicturyProxy. Esse objeto proxy encaminha todas as mensagens AVPictureinPictureControllerDelegate para 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.