वीडियो पब्लिशर के तौर पर, हो सकता है कि आप अपने दर्शकों को मिड-रोल विज्ञापनों को स्किप करने से रोकना चाहें. जब कोई उपयोगकर्ता विज्ञापन ब्रेक को स्किप करने की कोशिश करता है, तो उसे विज्ञापन ब्रेक की शुरुआत पर वापस ले जाया जा सकता है. इसके बाद, विज्ञापन ब्रेक खत्म होने पर, उसे उस जगह पर वापस ले जाया जा सकता है जहां उसने स्किप करने की कोशिश की थी. इस सुविधा को "स्नैपबैक" कहा जाता है.
उदाहरण के लिए, यहां दिया गया डायग्राम देखें. दर्शक कोई वीडियो देख रहा है और वह उसे पांच मिनट से 15 मिनट के बीच देखना चाहता है. हालांकि, वीडियो के 10 मिनट पूरे होने पर एक विज्ञापन ब्रेक है. आपको यह विज्ञापन ब्रेक, वीडियो के बाकी हिस्से को देखने से पहले दिखाना है:

इस विज्ञापन ब्रेक को दिखाने के लिए, यह तरीका अपनाएं:
- देखें कि क्या उपयोगकर्ता ने ऐसे विज्ञापन ब्रेक को स्किप किया है जिसे उसने नहीं देखा है. अगर ऐसा है, तो उसे वापस विज्ञापन ब्रेक पर ले जाएं.
- विज्ञापन ब्रेक खत्म होने के बाद, उन्हें उनकी मूल जगह पर वापस ले जाएं.
डायग्राम के तौर पर, यह ऐसा दिखता है:

AdvancedExample में दिखाए गए तरीके से, IMA डीएआई एसडीके का इस्तेमाल करके स्नैपबैक को लागू करने का तरीका यहां बताया गया है.
सीख करने पर, विज्ञापन ब्रेक को बिना देखे छोड़े जाने से रोकना है
देखें कि क्या उपयोगकर्ता ने ऐसे विज्ञापन ब्रेक को स्किप किया है जिसे उसने नहीं देखा है. अगर ऐसा है, तो उसे वापस विज्ञापन ब्रेक पर ले जाएं.
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; } }