Picture-in-picture

Questa guida è destinata ai publisher IMA che desiderano aggiungere Picture in Supporto dell'immagine all'implementazione IMA esistente.

Prerequisiti

Aggiungere il supporto della modalità Picture in picture alla tua app

A partire dalla versione 3.1.0 dell'SDK, IMA supporta la modalità Picture in picture di Apple per iPad. Per aggiungere il supporto di Picture in picture alla tua app, devi modificare impostazioni e implementare alcune nuove classi IMA, come mostrato di seguito.

Aggiornamento delle impostazioni per consentire la riproduzione in background

La modalità Picture in picture richiede che tu consenta la riproduzione di contenuti multimediali in background nella tua app.

  1. Imposta Modalità in background su ON per Audio, AirPlay e Picture in Picture come mostrato di seguito:

  2. Imposta le proprietà AVAudioSession in modo da supportare anche la riproduzione in background per l'attivazione della riproduzione in background in 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;
    }

Creazione di nuovi oggetti iOS e IMA per il picture-in-picture

Per supportare la modalità Picture in Picture, Apple ha aggiunto le classi AVPictureInPictureController e AVPictureinPictureControllerDelegate. IMA, da parte sua, ha aggiunto IMAPictureInPictureProxy. Per incorporare queste classi nel tuo progetto, aggiungi le seguenti istruzioni al codice:

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

Modificare la richiesta di annunci

Devi creare un altro nuovo oggetto: IMAAVPlayerVideoDisplay. Questo viene superato al costruttore IMAAdsRequest e consente all'SDK di inserire annunci in PIP quando il video è in riproduzione in modalità 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];
}

Inizio degli annunci

Gli annunci SDK IMA non possono essere avviati durante la modalità Picture in picture. Di conseguenza, devi assicurarti di chiamare [adsManager start] solo quando il tuo video è in modalità di riproduzione 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;
  }
}

Attivare la modalità Picture in picture

Se utilizzi un AVPlayer senza un AVPlayerViewController, devi aggiungere il tuo pulsante Picture in Picture. Ne abbiamo implementato uno nel nostro Esempio avanzato come questo:

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

Domande frequenti

Come faccio ad avviare gli annunci quando il video è in modalità Picture in picture?
Non è possibile avviare gli annunci mentre il video è in modalità Picture in picture. loro può essere avviato solo in modalità di riproduzione standard.
L'integrazione di Picture in picture esistente deve impostare self.pictureInPictureController.delegate sul mio corso. Come faccio a implementare gli annunci IMA in Picture in Picture e rimanere il delegato?
L'SDK IMA deve anche ricevere messaggi AVPictureinPictureControllerDelegate per attivare la riproduzione degli annunci in modalità Picture in Picture. Ecco perché ti chiediamo di impostare il delegato per AVPictureinPictureController su un'istanza di IMAPictureInPicturyProxy. Questo oggetto proxy inoltra tutti i messaggi AVPictureinPictureControllerDelegate alla tua app, ma inoltra anche le chiamate a IMA per abilitare il supporto Picture in Picture. Tieni presente che devi anche mantenere un handle locale all'AVPlayerlivello.