Dieser Leitfaden richtet sich an IMA-Publisher, die ihrer bestehenden IMA-Implementierung Bild-im-Bild-Unterstützung hinzufügen möchten.
Voraussetzungen
- Arbeiten Sie den Startleitfaden durch.
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.
Stellen Sie Hintergrundmodi für Audio, AirPlay und Bild im Bild auf EIN:
Lege die
AVAudioSession
-Attribute fest, um die Hintergrundwiedergabe zu unterstützen und die Hintergrundwiedergabe inIMASettings
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ürAVPictureinPictureController
auf eine Instanz vonIMAPictureInPicturyProxy
zu setzen. Dieses Proxyobjekt leitet alleAVPictureinPictureControllerDelegate
-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.