Bild im Bild

Dieser Leitfaden richtet sich an IMA-Publisher, die ihrer bestehenden IMA-Implementierung die Unterstützung für Picture-in-Picture hinzufügen möchten.

Vorbereitung

Bild-im-Bild-Unterstützung für Ihre App hinzufügen

Ab der SDK-Version 3.1.0 unterstützt IMA den Bild-im-Bild-Modus von Apple für das iPad. Wenn du deiner App die Unterstützung für Picture-in-Picture hinzufügen möchtest, musst du einige Einstellungen anpassen und einige neue IMA-Klassen implementieren, wie unten gezeigt.

Einstellungen aktualisieren, um die Hintergrundwiedergabe zuzulassen

Für den Modus „Bild im Bild“ müssen Sie die Medienwiedergabe im Hintergrund in Ihrer App zulassen.

  1. Aktivieren Sie die Hintergrundmodi für Audio, AirPlay und Bild im Bild, indem Sie die Optionen wie unten gezeigt auf AN stellen:

  2. Lege die AVAudioSession-Properties so fest, dass die Hintergrundwiedergabe unterstützt wird, und aktiviere die Hintergrundwiedergabe 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;
    }

Neue iOS- und IMA-Objekte für Bild-im-Bild-Videos erstellen

Zur Unterstützung von Picture-in-Picture hat Apple die Klassen AVPictureInPictureController und AVPictureinPictureControllerDelegate hinzugefügt. IMA hat seinerseits IMAPictureInPictureProxy hinzugefügt. Wenn Sie diese Klassen in Ihr Projekt einbinden möchten, fügen Sie Ihrem Code die folgenden Anweisungen hinzu:

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

Anzeigenanfrage ändern

Es muss noch ein neues Objekt erstellt werden: IMAAVPlayerVideoDisplay. Dieser Wert wird an den Konstruktor von IMAAdsRequest übergeben und ermöglicht es dem SDK, Anzeigen in das PiP-Fenster einzufügen, wenn dein Video im Bild-im-Bild-Modus wiedergegeben wird:

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

Anzeigen starten

IMA SDK-Anzeigen können nicht im Bild-im-Bild-Modus gestartet werden. Du musst also darauf achten, dass du [adsManager start] nur aufrufst, wenn dein Video im Standardwiedergabemodus ist:

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

Bild-im-Bild-Modus aktivieren

Wenn Sie ein AVPlayer ohne AVPlayerViewController verwenden, müssen Sie eine eigene Schaltfläche für die Bild-im-Bild-Funktion hinzufügen. In unserem erweiterten Beispiel haben wir eine solche Funktion so implementiert:

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

FAQ

Wie starte ich Anzeigen, wenn das Video im Bild-im-Bild-Modus wiedergegeben wird?
Anzeigen können nicht gestartet werden, während das Video im Bild-im-Bild-Modus wiedergegeben wird. Sie können nur im Standardwiedergabemodus gestartet werden.
Bei meiner vorhandenen Bild-in-Bild-Integration muss self.pictureInPictureController.delegate auf meine eigene Klasse festgelegt werden. Wie kann ich IMA-Anzeigen in der Funktion „Bild-im-Bild“ implementieren und trotzdem als delegierter Publisher fungieren?
Das IMA SDK muss außerdem AVPictureinPictureControllerDelegate Nachrichten empfangen, um die Anzeigenwiedergabe im Bild-im-Bild-Modus zu ermöglichen. Wir empfehlen Ihnen daher, den Delegate für AVPictureinPictureController auf eine Instanz von IMAPictureInPicturyProxy festzulegen. Dieses Proxyobjekt leitet alle AVPictureinPictureControllerDelegate-Nachrichten an deine App weiter, aber auch die Aufrufe an IMA, um die Unterstützung von Picture-in-Picture zu aktivieren. Außerdem musst du einen lokalen Handle für deine AVPlayerLayer verwalten.