Bir video yayıncısı olarak, izleyicilerinizin ara reklamlarınızı atlamasını engellemek isteyebilirsiniz. Kullanıcı bir reklam arasını atladığında onu reklam arasının başlangıcına geri götürebilir ve reklam arası tamamlandıktan sonra daha önce gittiği oynatma konumuna döndürebilirsiniz. Bu özelliğe "geri sarma" denir.
Örnek olarak aşağıdaki şemaya bakın. İzleyiciniz bir video izlerken 5. dakikadan 15. dakikaya atlamaya karar veriyor. Ancak, 10. dakikada bir reklam arası var ve bu reklam arasını izlemeden sonraki içeriği izleyemezler:

Bu reklam arasını göstermek için aşağıdaki adımları uygulayın:
- Kullanıcının, izlenmemiş bir reklam arasını atlayarak ileri sarma işlemi yapıp yapmadığını kontrol edin. Yaptıysa kullanıcıyı reklam arasına geri götürün.
- Reklam arası tamamlandıktan sonra kullanıcıları orijinal oynatma konumlarına geri döndürün.
Bu durum, diyagram şeklinde şu şekilde görünür:

Bu iş akışını IMA DAI SDK'sında AdvancedExample'da yapıldığı gibi nasıl uygulayacağınız aşağıda açıklanmıştır.
İzlenmemiş reklamların atlanmasını önleme
Kullanıcı bir reklam arasını atlamaya çalışırsa oynatıcı, atlamayı algılamalı ve oynatmayı söz konusu reklam arasının başına yönlendirmelidir. İzlenmemiş reklamların atlanmasını önlemek için aşağıdakileri yapın:
- Kullanıcı, arama çubuğuyla etkileşime başladığında mevcut oynatma süresini kaydedin.
- Kullanıcı akışta farklı bir zamana gitme işlemini tamamladıktan sonra bu zamandan önce bulunan en son reklam arasını belirleyin.
- Reklam arası, kaydedilen başlangıç zamanından sonra başlarsa (atlama olduğunu gösterir) ve henüz oynatılmamışsa oynatıcıyı reklam arasının başına getirin.
- Bu reklam arasının zorunlu kılındığını izlemek için
snapbackModeişaretini etkinleştirin.
Objective-C
- (IBAction)videoControlsTouchStarted:(id)sender {
[NSObject cancelPreviousPerformRequestsWithTarget:self
selector:@selector(hideFullscreenControls)
object:self];
self.currentlySeeking = YES;
self.seekStartTime = self.contentPlayer.currentTime;
}
- (IBAction)videoControlsTouchEnded:(id)sender {
if (self.fullscreen) {
[self startHideControlsTimer];
}
self.currentlySeeking = NO;
if (!self.adPlaying) {
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 our landing
// place.
[self.contentPlayer
seekToTime:CMTimeMakeWithSeconds(lastCuepoint.startTime + 1, NSEC_PER_SEC)];
}
}
}
Swift
@IBAction func progressBarTouchStarted(_ sender: UISlider) {
guard !isAdPlaying else { return }
currentlySeeking = true
seekStartTime = contentPlayer.currentTime().seconds
}
// MARK: Snapback Logic
@IBAction func progressBarTouchEnded(_ sender: UISlider) {
guard !isAdPlaying else { return }
if isFullScreen {
startHideControlsTimer()
}
currentlySeeking = false
seekEndTime = Float64(sender.value)
guard let streamManager else { return }
if let lastCuepoint = streamManager.previousCuepoint(forStreamTime: seekEndTime) {
if !lastCuepoint.isPlayed, lastCuepoint.startTime > seekStartTime {
logMessage(
"Snapback to \(String(format: "%.2f", lastCuepoint.startTime)) from \(String(format: "%.2f", seekEndTime))"
)
snapbackMode = true
contentPlayer.seek(
to: CMTime(seconds: Double(sender.value), preferredTimescale: 1000))
}
}
}
Orijinal arama işlemini sürdürme
Zorunlu reklam arası oynatıldıktan sonra oynatıcı, kullanıcıyı istenen içerik noktasına yönlendirir.
Kullanıcının orijinal arama işlemine devam etmek için aşağıdakileri yapın:
Akış yöneticinizde
AD_BREAK_ENDEDetkinliğini dinleyin.Bu atlamanın zorunlu reklam görüntülemeden sonra gerçekleştiğinden emin olmak için
snapbackModeişaretinin etkin olup olmadığını kontrol edin.Etkinse kullanıcıyı amaçlanan zaman damgasına döndürmek için oynatıcıyı kayıtlı hedef zamana getirin.
Aşağıdaki örnek, tamamlanmış bir reklam arasını dinler ve kullanıcıyı orijinal arama işlemine döndürür:
Objective-C
case kIMAAdEvent_AD_BREAK_ENDED: {
[self logMessage:@"Ad break ended"];
self.adPlaying = NO;
if (self.snapbackMode) {
self.snapbackMode = NO;
if (CMTimeCompare(self.seekEndTime, self.contentPlayer.currentTime)) {
[self.contentPlayer seekToTime:self.seekEndTime];
}
}
break;
}
Swift
case .AD_BREAK_ENDED:
logMessage("Ad break ended")
isAdPlaying = false
progressBar.isUserInteractionEnabled = true
if snapbackMode {
snapbackMode = false
if contentPlayer.currentTime().seconds < seekEndTime {
contentPlayer.seek(to: CMTime(seconds: Double(seekEndTime), preferredTimescale: 1000))
}
} else if pendingBookmarkSeek, let time = bookmarkStreamTime {
logMessage(String(format: "AD_BREAK_ENDED: Seeking to bookmark streamTime: %.2f", time))
imaVideoDisplay.seekStream(toTime: time)
pendingBookmarkSeek = false
bookmarkStreamTime = nil
}
updatePlayHeadState(isPlaying: self.isContentPlaying)