Ten przewodnik jest przeznaczony dla wydawców IMA, którzy chcą dodać obsługę obrazu w obrazie do swojej implementacji IMA.
Wymagania wstępne
- Zapoznaj się z przewodnikiem dla początkujących.
Dodawanie obsługi obrazu w obrazie do aplikacji
Od wersji 3.1.0 pakietu SDK IMA obsługuje tryb Picture in Picture firmy Apple na iPadzie. Aby dodać do aplikacji obsługę obrazu w powiększeniu, musisz zmienić kilka ustawień i wdrażać kilka nowych klas IMA, jak pokazano poniżej.
Aktualizowanie ustawień, aby umożliwić odtwarzanie w tle
Tryb obrazu w obrazie wymaga zezwolenia na odtwarzanie multimediów w tle w aplikacji.
Ustaw tryby w tle na WŁĄCZONY w przypadku dźwięku, AirPlay i obrazu w obrazie, jak pokazano na ilustracji poniżej:
Ustaw właściwości
AVAudioSession
, aby obsługiwać odtwarzanie w tle, a także włącz odtwarzanie w tle wIMASettings
:... – (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; }
Tworzenie nowych obiektów na iOS i IMA do obrazu w obrazie
Aby obsługiwać tryb obrazu w obrazie, firma Apple dodała klasy AVPictureInPictureController
i AVPictureinPictureControllerDelegate
. IMA dodało IMAPictureInPictureProxy
. Aby uwzględnić te klasy w projekcie, dodaj do kodu te instrukcje:
... @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; }
Modyfikowanie żądania reklamy
Trzeba utworzyć jeszcze 1 nowy obiekt: IMAAVPlayerVideoDisplay
. Jest on przekazywany do konstruktora IMAAdsRequest
i pozwala pakietowi SDK wstawiać reklamy do okna PiP podczas odtwarzania filmu w tym trybie:
... - (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]; }
Uruchamianie reklam
Reklam IMA SDK nie można wyświetlać w trybie obraz w obrazie. W związku z tym musisz wywoływać funkcję [adsManager start]
tylko wtedy, gdy film jest w standardowym trybie odtwarzania:
... - (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; } }
Włączanie trybu obrazu w obrazie
Jeśli używasz AVPlayer
bez AVPlayerViewController
, musisz dodać własny przycisk obrazu w obrazie. W naszym AdvancedSample zaimplementowaliśmy taki:
- (IBAction)onPipButtonClicked:(id)sender {
if ([self.pictureInPictureController isPictureInPictureActive]) {
[self.pictureInPictureController stopPictureInPicture];
} else {
[self.pictureInPictureController startPictureInPicture];
}
}
Najczęstsze pytania
- Jak rozpocząć reklamy, gdy film jest w trybie obrazu w obrazie?
- Reklamy nie mogą być uruchamiane, gdy film jest w trybie obrazu w obrazie. Można je uruchamiać tylko w standardowym trybie odtwarzania.
- Moja obecna integracja z trybem obrazu w obrazie musi mieć wartość
self.pictureInPictureController.delegate
ustawioną na moją klasę. How can I implement IMA ads in Picture in Picture and still be the delegate? - Pakiet IMA SDK musi też otrzymywać wiadomości
AVPictureinPictureControllerDelegate
, aby umożliwić odtwarzanie reklam w trybie obrazu w obrazie. Dlatego prosimy o ustawienie delegataAVPictureinPictureController
na instancjęIMAPictureInPicturyProxy
. Ten obiekt serwera proxy przekazuje wszystkie komunikatyAVPictureinPictureControllerDelegate
do Twojej aplikacji, ale także przekazuje wywołania do pakietu IMA, aby umożliwić obsługę obrazu w obrazie. Pamiętaj, że musisz też utrzymywać lokalny identyfikator warstwy AVPlayer.