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 implementacji tego przepływu pracy w pakiecie IMA DAI SDK, tak jak w przypadku 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 przypadku przykładu zaawansowanego dla iOS użyj interakcji użytkownika z interfejsem, aby wykryć, kiedy wykonał on przewijanie. Zachowaj czas rozpoczęcia przewijania, aby sprawdzić, czy użytkownik pominął nieodtwarzaną przerwę na reklamę. Gdy użytkownik zwolni elementy sterujące odtwarzaniem, porównaj bieżący czas z czasem ostatniej przerwy na reklamy. Jeśli przerwa na reklamę przypada po czasie rozpoczęcia przewijania (co oznacza, że użytkownik ją pominął) i nie została jeszcze odtworzona, cofnij odtwarzanie do początku przerwy na reklamę. Ustaw też flagę powrotu do poprzedniego stanu, aby sprawdzić ją później w obsłudze zakończenia bloku reklamowego:
- (IBAction)videoControlsTouchStarted:(id)sender {
self.seekStartTime = self.contentPlayer.currentTime;
}
- (IBAction)videoControlsTouchEnded:(id)sender {
self.seekEndTime = CMTimeMake(self.progressBar.value, 1);
IMACuepoint *lastCuepoint =
[self.streamManager previousCuepointForStreamTime:CMTimeGetSeconds(self.seekEndTime)];
if (!lastCuepoint.played && (lastCuepoint.startTime > CMTimeGetSeconds(self.seekStartTime))) {
self.snapbackMode = YES
// Add 1 to the seek time to get the keyframe at the start of the ad to be your landing place.
[self.contentPlayer seekToTime:CMTimeMakeWithSeconds(lastCuepoint.startTime + 1, NSEC_PER_SEC)];
}
}
Przywróć użytkownikowi pierwotne miejsce odtwarzania
W obsłudze zdarzenia ad-break-ended sprawdź, czy poprzednia przerwa została odtworzona w wyniku powrotu do poprzedniego stanu. Jeśli tak, przywróć użytkownikowi miejsce, do którego chciał przejść (o ile nie było to w trakcie właśnie odtworzonej przerwy na reklamę):
- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {
switch (event.type) {
case kIMAAdEvent_AD_BREAK_ENDED: {
if (self.snapbackMode) {
self.snapbackMode = NO;
if (CMTimeCompare(self.seekEndTime, self.contentPlayer.currentTime)) {
[self.contentPlayer seekToTime:self.seekEndTime];
}
}
break;
}
}
}