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
- Folgen Sie dem Startleitfaden.
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.
Aktivieren Sie die Hintergrundmodi für Audio, AirPlay und Bild im Bild, indem Sie die Optionen wie unten gezeigt auf AN stellen:
Lege die
AVAudioSession
-Properties so fest, dass die Hintergrundwiedergabe unterstützt wird, und aktiviere die Hintergrundwiedergabe inIMASettings
:... – (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ürAVPictureinPictureController
auf eine Instanz vonIMAPictureInPicturyProxy
festzulegen. Dieses Proxyobjekt leitet alleAVPictureinPictureControllerDelegate
-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.