Pantalla en pantalla

Esta guía está destinada a los publicadores de IMA que deseen agregar la compatibilidad con la función pantalla en pantalla a su implementación de IMA existente.

Requisitos previos

Cómo agregar compatibilidad con la función pantalla en pantalla a tu app

A partir de la versión 3.1.0 del SDK, IMA es compatible con el modo pantalla en pantalla de Apple para iPad. Para agregar compatibilidad con la función pantalla en pantalla a tu app, debes modificar algunos parámetros de configuración y, luego, implementar algunas clases de IMA nuevas, como se muestra a continuación.

Cómo actualizar la configuración para permitir la reproducción en segundo plano

El modo de pantalla en pantalla requiere que permitas la reproducción de contenido multimedia en segundo plano en tu app.

  1. Establece la opción Modos en segundo plano en ACTIVADO para Audio, AirPlay y Pantalla en pantalla, como se muestra a continuación:

  2. Configura las propiedades de AVAudioSession para admitir la reproducción en segundo plano y habilita la reproducción en segundo plano en 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;
    }

Cómo crear objetos nuevos de iOS y IMA para la función de pantalla en pantalla

Para admitir la función pantalla en pantalla, Apple agregó las clases AVPictureInPictureController y AVPictureinPictureControllerDelegate. IMA, por su parte, agregó IMAPictureInPictureProxy. Para incorporar estas clases en tu proyecto, agrega las siguientes declaraciones a tu 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;
}

Cómo modificar tu solicitud de anuncios

Hay un objeto nuevo más para crear: IMAAVPlayerVideoDisplay. Esto se pasa a tu constructor IMAAdsRequest y permite que el SDK inserte anuncios en la ventana de PIP cuando tu video se reproduce en el modo pantalla en pantalla:

...
- (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];
}

Cómo iniciar los anuncios

Los anuncios con el SDK de IMA no se pueden iniciar durante el modo de pantalla en pantalla. Por lo tanto, debes asegurarte de llamar a [adsManager start] solo cuando tu video esté en el modo de reproducción estándar:

...
- (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;
  }
}

Cómo ingresar al modo de pantalla en pantalla

Si usas un objeto AVPlayer sin un AVPlayerViewController, debes agregar tu propio botón de pantalla en pantalla. Implementamos una en nuestra Muestra avanzada de la siguiente manera:

- (IBAction)onPipButtonClicked:(id)sender {
  if ([self.pictureInPictureController isPictureInPictureActive]) {
    [self.pictureInPictureController stopPictureInPicture];
  } else {
    [self.pictureInPictureController startPictureInPicture];
  }
}

Preguntas frecuentes

¿Cómo empiezo a publicar anuncios cuando el video está en el modo de pantalla en pantalla?
No se pueden iniciar anuncios mientras el video está en el modo de pantalla en pantalla; solo se pueden iniciar en el modo de reproducción estándar.
Mi integración existente de pantalla en pantalla debe establecer self.pictureInPictureController.delegate en mi propia clase. ¿Cómo puedo implementar los anuncios de IMA en el modo pantalla en pantalla y seguir siendo delegado?
El SDK de IMA también debe recibir mensajes AVPictureinPictureControllerDelegate para habilitar la reproducción de anuncios en el modo pantalla en pantalla. Es por eso que te pedimos que configures el delegado de AVPictureinPictureController en una instancia de IMAPictureInPicturyProxy. Este objeto proxy reenvía todos los mensajes de AVPictureinPictureControllerDelegate a tu app, pero también reenvía las llamadas a IMA para habilitar la compatibilidad con pantalla en pantalla. Ten en cuenta que también debes mantener un controlador local para tu AVPlayerLayer.