Jako wydawca filmów możesz chcieć uniemożliwić widzom oglądanie Twoich reklam w trakcie filmu. Gdy użytkownik przeszukuje miejsce poza przerwą na reklamę, możesz cofnąć tę przerwę na początek przerwy na reklamę, a potem wrócić do miejsca przeszukania po zakończeniu przerwy na reklamę. Ta funkcja nosi nazwę „snapback”.
Przykład znajduje się na poniższym diagramie. Widz ogląda film i postanawia przewinąć film od 5 do 15 minut. Po 10 minutach następuje przerwa na reklamę, którą widzowie muszą obejrzeć, zanim będą mogli obejrzeć kolejne treści:
Aby wyświetlać tę przerwę na reklamę, wykonaj te czynności:
- Sprawdź, czy użytkownik wykonał wyszukiwanie, które przekroczyło nieobejrzaną przerwę na reklamę, a jeśli tak, przywróć mu przerwę na reklamę.
- Po zakończeniu przerwy na reklamę wróć do pierwotnego wyszukiwania.
W formie diagramu wygląda to tak:
Oto jak wdrożyć ten przepływ pracy w pakiecie SDK tvOS IMA SDK w sposób podany w AdvancedExample.
Zapobieganie pozostawianiu przerwy na reklamę niewykorzystaną przez przewijanie
Sprawdź, czy użytkownik wykonał wyszukiwanie, które przekroczyło nieobejrzaną przerwę na reklamę, a jeśli tak, przywróć mu przerwę na reklamę.
W przykładzie zaawansowanym dotyczącym tvOS korzysta się z dyrektywy AVPlayerViewController
, która ma metodę delegowania, która informuje, że użytkownik uruchomił wyszukiwanie.
Jeśli czas rozpoczęcia wyszukiwania przypada przed poprzednią przerwą na reklamę (co oznacza, że użytkownik przeszedł poza nią), a przerwa nie została jeszcze odtworzona, wróć do początku przerwy na reklamę. Zapisz też w module obsługi ad-break-did-end
czas rozpoczęcia wyszukiwania, które zostało wstępnie wskazane w późniejszym czasie:
- (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 wyszukiwanie
W delegacji wydarzenia zmień wielkość liter w haśle AD_BREAK_ENDED
, aby sprawdzić, czy poprzednia przerwa na reklamę została odtworzona w wyniku wycofania.
- (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; } }