Picture-in-picture

Ce guide est destiné aux éditeurs IMA qui souhaitent ajouter la compatibilité Picture-in-picture à leur implémentation IMA existante.

Conditions préalables

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

À partir de la version 3.1.0 du SDK, IMA prend en charge le mode Picture-in-picture d'Apple pour iPad. Pour que votre application prenne en charge le mode Picture-in-picture, vous devez modifier quelques paramètres et implémenter de nouvelles classes IMA, comme indiqué ci-dessous.

Mise à jour des paramètres pour autoriser la lecture en arrière-plan...

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

  1. Définissez Background Modes (Modes d'arrière-plan) sur ON (Activé) 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 pour activer 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 Picture-in-picture, Apple a ajouté les classes AVPictureInPictureController et AVPictureinPictureControllerDelegate. IMA, pour sa part, a ajouté IMAPictureInPictureProxy. Pour intégrer ces classes dans 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;
}

Modification de votre demande d'annonce...

Vous devez encore créer un objet: IMAAVPlayerVideoDisplay. Il est transmis à 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];
}

Diffusion des annonces

Les annonces utilisant le SDK IMA ne peuvent pas être diffusées en mode Picture-in-picture. Par conséquent, vous devez vous assurer que vous n'appelez [adsManager start] que 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 implémenté un dans notre exemple avancé, comme suit:

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

Questions fréquentes

Comment diffuser 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 Picture-in-picture existante doit définir self.pictureInPictureController.delegate sur ma propre classe. Comment puis-je implémenter des annonces IMA en mode Picture-in-picture tout en étant le délégué ?
Le SDK IMA doit également recevoir des messages AVPictureinPictureControllerDelegate pour permettre 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 de proxy transfère tous les messages AVPictureinPictureControllerDelegate vers votre application, mais transfère également les appels à IMA pour activer la compatibilité Picture-in-picture. Notez que vous devez également conserver un identifiant local pour votre AVPlayerLayer.