Jako wydawca filmów możesz chcieć uniemożliwić widzom przewijanie reklam w trakcie filmu. Gdy użytkownik przewinie przerwę na reklamę, możesz cofnąć odtwarzanie do początku tej przerwy, a następnie po jej zakończeniu wrócić do miejsca przewinięcia. Ta funkcja nazywa się „snapback”.
Przykład znajdziesz na diagramie poniżej. Widz ogląda film i postanawia przewinąć go z 5 minuty do 15 minuty. W 10 minucie filmu znajduje się jednak przerwa na reklamę, którą chcesz wyświetlić użytkownikom przed odtworzeniem dalszej części filmu:
Aby wyświetlić tę przerwę na reklamy, wykonaj te czynności:
- Sprawdź, czy użytkownik przewinął nieobejrzaną przerwę na reklamę, a jeśli tak, cofnij go do tej przerwy.
- Po zakończeniu przerwy na reklamę odtwarzanie jest wznawiane od miejsca przewinięcia.
Na diagramie wygląda to tak:
Poniżej znajdziesz instrukcje wdrażania funkcji powrotu do punktu początkowego za pomocą pakietu IMA DAI SDK, jak pokazano w przykładzie AdvancedExample.
Zapobieganie pomijaniu przerw na reklamy
Sprawdź, czy użytkownik przewinął film poza nieobejrzaną przerwę na reklamę, a jeśli tak, cofnij go do tej przerwy.
W zaawansowanym przykładzie tvOS wykorzystano AVPlayerViewController
, które ma metodę delegowania informującą o tym, że użytkownik przewinął film.
Jeśli czas rozpoczęcia przewijania jest wcześniejszy niż poprzednia przerwa na reklamę (co oznacza, że użytkownik ją pominął), a ta przerwa nie została jeszcze odtworzona, cofnij odtwarzanie do początku przerwy na reklamę. Zapisz też czas rozpoczęcia początkowego żądania wyszukiwania, aby później sprawdzić go w funkcji obsługi ad-break-did-end
:
- (void)playerViewController:(AVPlayerViewController *)playerViewController willResumePlaybackAfterUserNavigatedFromTime:(CMTime)oldTime toTime:(CMTime)targetTime { if (self.streamManager) { IMACuepoint *prevCuepoint = [self.streamManager previousCuepointForStreamTime:CMTimeGetSeconds(targetTime)]; if (prevCuepoint && !prevCuepoint.isPlayed && oldTime < prevCuepoint.startTime) { self.userSeekTime = CMTimeGetSeconds(targetTime); [self.playerViewController.player seekToTime:CMTimeMakeWithSeconds( prevCuepoint.startTime, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; } } }
Przywróć użytkownikowi pierwotne miejsce odtwarzania
W delegacie zdarzenia zmień przypadek AD_BREAK_ENDED
, aby sprawdzić, czy poprzednia przerwa na reklamę została odtworzona w wyniku powrotu do poprzedniego stanu.
- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event { NSLog(@"StreamManager event (%@).", event.typeString); switch (event.type) { // Your other events go here as normal. case kIMAAdEvent_AD_BREAK_ENDED: { if (self.userSeekTime > 0) { self.playerViewController.player seekToTime:CMTimeMakeWithSeconds(self.userSeekTime, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; self.userSeekTime = 0; // existing handling for AD_BREAK_ENDED goes here. break; } // And so on for other events. default: break; } }