Издатели видеоконтента могут запретить пользователям перематывать рекламу в середине видео. Если пользователь перемотал рекламную паузу, вы можете вернуть его к ее началу, а после показа рекламы возобновить просмотр с нужного момента времени. Эта функция называется "возврат".
Пример показан на диаграмме ниже. Пользователь смотрит видео и решает перемотать его с 5-й минуты на 15-ю. Однако на 10-й минуте есть рекламная пауза, которую зрители должны посмотреть, прежде чем продолжить просмотр контента.

Чтобы показать эту рекламную паузу, выполните следующие действия:
- Проверьте, не пропустил ли пользователь рекламную паузу при перемотке. Если да, верните его к началу этой паузы.
- После завершения рекламной паузы возобновите просмотр с нужного момента времени.
На диаграмме это выглядит так:

Ниже описано, как реализовать возврат с помощью IMA DAI SDK, как показано в AdvancedExample.
Как запретить пользователям пропускать рекламные паузы
Проверьте, не пропустил ли пользователь рекламную паузу. Если да, верните его к ней.
В расширенном примере для tvOS используется класс AVPlayerViewController, в котором есть метод делегата, сообщающий о том, что пользователь выполнил перемотку.
Если время начала перемотки предшествует предыдущей рекламной паузе (то есть пользователь ее пропустил) и эта пауза ещё не была воспроизведена, перемотайте видео назад к началу рекламной паузы. Также запишите время начала изначально запрошенной перемотки, чтобы позже проверить его в обработчике 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]; } } }
Вернуть пользователя к исходной позиции
В делегате события измените вариант AD_BREAK_ENDED, чтобы проверить, была ли предыдущая рекламная пауза воспроизведена в результате возврата.
- (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; } }