Die Funktion „Bild im Bild“

Dieser Leitfaden richtet sich an IMA-Publisher, die ihrer bestehenden IMA-Implementierung Bild-im-Bild-Unterstützung hinzufügen möchten.

Voraussetzungen

Unterstützung für Bild im Bild zu Ihrer App hinzufügen

Ab SDK-Version 3.1.0 unterstützt IMA den Bild-in-Bild-Modus von Apple für das iPad. Damit die Bild-im-Bild-Funktion Ihrer App unterstützt wird, müssen Sie einige Einstellungen anpassen und einige neue IMA-Klassen implementieren (siehe unten).

Einstellungen werden aktualisiert, um die Hintergrundwiedergabe zuzulassen

Für den Bild-im-Bild-Modus müssen Sie in Ihrer App die Wiedergabe von Medien im Hintergrund zulassen.

  1. Stellen Sie Hintergrundmodi für Audio, AirPlay und Bild im Bild auf EIN:

  2. Lege die AVAudioSession-Attribute fest, um die Hintergrundwiedergabe zu unterstützen und die Hintergrundwiedergabe in IMASettings zu aktivieren:

    ...
    – (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 erstellen

Zur Unterstützung von Bild im Bild hat Apple die Klassen AVPictureInPictureController und AVPictureinPictureControllerDelegate hinzugefügt. IMA wiederum hat 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;
}

Anzeigenanfragen ändern

Es muss noch ein weiteres neues Objekt erstellt werden: IMAAVPlayerVideoDisplay. Diese wird an den Konstruktor IMAAdsRequest übergeben, damit das SDK Anzeigen in das BiB-Fenster einfügen kann, wenn Ihr 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 während des Bild-im-Bild-Modus gestartet werden. [adsManager start] darf nur dann aufgerufen werden, wenn sich Ihr Video im Standardwiedergabemodus befindet:

...
- (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 wird aktiviert

Wenn Sie AVPlayer ohne AVPlayerViewController verwenden, müssen Sie eine eigene Bild-im-Bild-Schaltfläche hinzufügen. Wir haben eine solche in unserem erweiterten Beispiel so implementiert:

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

Häufig gestellte Fragen

Wie schalte ich Anzeigen, wenn das Video im Bild-im-Bild-Modus ist?
Anzeigen können nicht gestartet werden, während das Video im Bild-im-Bild-Modus ist. Sie können nur im Standard-Wiedergabemodus gestartet werden.
Bei meiner bestehenden Bild-in-Bild-Integration muss self.pictureInPictureController.delegate auf meine eigene Klasse festgelegt werden. Wie kann ich IMA-Anzeigen in Bild im Bild implementieren und dennoch der Bevollmächtigte sein?
Das IMA SDK muss außerdem AVPictureinPictureControllerDelegate-Nachrichten empfangen, damit die Anzeigenwiedergabe im Bild-im-Bild-Modus aktiviert werden kann. Aus diesem Grund bitten wir Sie, den Delegaten für AVPictureinPictureController auf eine Instanz von IMAPictureInPicturyProxy zu setzen. Dieses Proxyobjekt leitet alle AVPictureinPictureControllerDelegate-Nachrichten an Ihre Anwendung weiter, leitet die Aufrufe aber auch an IMA weiter, um die Bild-in-Bild-Unterstützung zu aktivieren. Sie müssen außerdem ein lokales Handle für Ihre AVPlayerLayer verwalten.