Picture-in-picture

Ce guide s'adresse aux éditeurs IMA qui souhaitent ajouter la compatibilité avec Picture-in-Picture à leur implémentation IMA existante.

Prérequis

Ajouter la compatibilité Picture-in-picture à votre application

À partir de la version 3.1.0 du SDK, IMA est compatible avec le mode Picture-in-Picture d'Apple pour iPad. Pour ajouter la prise en charge du Picture-in-picture à votre application, vous devez ajuster quelques paramètres et implémenter de nouvelles classes IMA, comme indiqué ci-dessous.

Modifier les paramètres pour autoriser la lecture en arrière-plan

Le mode Picture-in-picture nécessite que vous autorisiez la lecture multimédia en arrière-plan dans votre application.

  1. Définissez Modes en arrière-plan sur ACTIVE pour Audio, AirPlay et Picture-in-picture, comme indiqué ci-dessous:

  2. Définissez les propriétés AVAudioSession pour permettre la lecture en arrière-plan et activez la lecture en arrière-plan dans 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;
    }

Créer des objets iOS et IMA pour le mode Picture-in-picture

Pour prendre en charge le mode Picture-in-Picture, Apple a ajouté les classes AVPictureInPictureController et AVPictureinPictureControllerDelegate. IMA, pour sa part, a ajouté IMAPictureInPictureProxy. Pour intégrer ces classes à votre projet, ajoutez les instructions suivantes à votre code:

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

Modifier votre demande d'annonce

Vous devez créer un autre objet: IMAAVPlayerVideoDisplay. Cette valeur est transmise à votre constructeur IMAAdsRequest et permet au SDK d'insérer des annonces dans la fenêtre PiP lorsque votre vidéo est lue en mode 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];
}

Démarrer des annonces

Les annonces du SDK IMA ne peuvent pas être lancées en mode Picture-in-picture. Par conséquent, vous devez vous assurer d'appeler uniquement [adsManager start] lorsque votre vidéo est en mode de lecture standard:

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

Activation du mode Picture-in-picture...

Si vous utilisez un AVPlayer sans AVPlayerViewController, vous devez ajouter votre propre bouton Picture-in-picture. Nous en avons mis en œuvre dans notre exemple avancé comme ceci:

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

Questions fréquentes

Comment lancer des annonces lorsque la vidéo est en mode Picture-in-picture ?
Les annonces ne peuvent pas être lancées lorsque la vidéo est en mode Picture-in-picture. Elles ne peuvent être lancées qu'en mode de lecture standard.
Mon intégration du mode Picture-in-picture existant doit définir self.pictureInPictureController.delegate sur ma propre classe. Comment implémenter des annonces IMA en mode Picture-in-picture tout en restant le délégué ?
Le SDK IMA doit également recevoir des messages AVPictureinPictureControllerDelegate pour activer la lecture des annonces en mode Picture-in-picture. C'est pourquoi nous vous demandons de définir le délégué pour AVPictureinPictureController sur une instance de IMAPictureInPicturyProxy. Cet objet proxy transfère tous les messages AVPictureinPictureControllerDelegate vers votre application, mais transfère également les appels vers IMA pour activer la compatibilité avec le mode Picture-in-picture. Notez que vous devez également gérer un gestionnaire local pour votre AVPlayerLayer.