Unterstützung für Bild-im-Bild-Modus

Media Ads (IMA) SDK für iOS.

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

Vorbereitung

Bild-im-Bild-Unterstützung in Ihre App einfügen

Ab SDK-Version 3.1.0 unterstützt IMA den Bild-im-Bild-Modus von Apple für das iPad. Wenn Sie Ihrer App Unterstützung für den Bild-im-Bild-Modus hinzufügen möchten, müssen Sie einige Einstellungen anpassen und einige neue IMA-Klassen implementieren, wie unten gezeigt.

Einstellungen für die Hintergrundwiedergabe aktualisieren

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

  1. Stelle Hintergrundmodi für Audio, AirPlay und Bild im Bild auf EIN, wie unten dargestellt:

  2. Lege die AVAudioSession-Attribute fest, um die Hintergrundwiedergabe zu unterstützen, 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 die Bild-im-Bild-Funktion erstellen

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

Anzeigenanfrage ändern

Es gibt noch ein weiteres neues Objekt, das erstellt werden muss: IMAAVPlayerVideoDisplay. Dieser Wert wird an den IMAAdsRequest-Konstruktor übergeben und ermöglicht dem SDK, Anzeigen in das BiB-Fenster einzufügen, 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 schalten

IMA SDK-Anzeigen können nicht im Bild-im-Bild-Modus gestartet werden. Deshalb musst du darauf achten, [adsManager start] nur aufzurufen, wenn sich dein 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 aktivieren

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

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

FAQ

Wie starte ich Anzeigen, wenn sich das Video im Bild-im-Bild-Modus befindet?
Anzeigen können nicht gestartet werden, während sich das Video im Bild-im-Bild-Modus befindet. Sie können nur im Standardwiedergabemodus gestartet werden.
Bei meiner bestehenden Bild-im-Bild-Integration muss self.pictureInPictureController.delegate auf meine eigene Klasse festgelegt werden. Wie kann ich IMA-Anzeigen im Bild-im-Bild-Modus implementieren und trotzdem der Delegat sein?
Das IMA SDK muss auch AVPictureinPictureControllerDelegate-Nachrichten empfangen, damit die Anzeigenwiedergabe im Bild-im-Bild-Modus möglich ist. Deshalb bitten wir Sie, den Delegaten für AVPictureinPictureController auf eine Instanz von IMAPictureInPicturyProxy festzulegen. Dieses Proxy-Objekt leitet alle AVPictureinPictureControllerDelegate-Nachrichten an Ihre App weiter, aber auch die Aufrufe an IMA, um die Bild-im-Bild-Unterstützung zu ermöglichen. Beachten Sie, dass Sie auch einen lokalen Handle für Ihr AVPlayerLayer-Objekt beibehalten müssen.