동영상 게시자는 시청자가 미드롤 광고를 탐색하지 못하도록 방지할 수 있습니다. 사용자가 광고 시점을 탐색하면 사용자를 해당 광고 시점의 시작 지점으로 다시 이동시킨 후 광고 시점이 완료되면 탐색 위치로 다시 이동시킬 수 있습니다. 이 기능을 '스냅백'이라고 합니다.
예를 들어 아래 다이어그램을 참고하세요. 시청자가 동영상을 시청하다가 5분 지점에서 15분 지점으로 탐색하기로 결정합니다. 그러나 10분 지점에 광고 시점이 있으며 시청자가 이 광고 시점을 시청한 후에 콘텐츠를 시청하도록 하려고 합니다.

이 광고 시점을 표시하려면 다음 단계를 따르세요.
- 사용자가 시청하지 않은 광고 시점을 건너뛰는 탐색을 실행했는지 확인하고, 실행한 경우 사용자를 광고 시점으로 다시 이동시킵니다.
- 광고 시점이 완료되면 사용자를 원래 탐색 위치로 다시 이동시킵니다.
다이어그램 형식은 다음과 같습니다.

다음은 AdvancedExample에 설명된 대로 IMA DAI SDK를 사용하여 스냅백을 구현하는 방법입니다.
탐색으로 인해 광고 시점을 시청하지 않고 건너뛰는 것을 방지
사용자가 시청하지 않은 광고 시점을 건너뛰는 탐색을 실행했는지 확인하고, 실행한 경우 사용자를 광고 시점으로 다시 이동시킵니다.
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; } }