Snapback hareketi

Video yayıncısı olarak, izleyicilerinizin videonun ortasında gösterilen reklamları geçmesini önlemek isteyebilirsiniz. Kullanıcı bir reklam arasını geçtikten sonra arama yaptığında reklam arasının başlangıcına geri götürebilir ve reklam arası tamamlandıktan sonra daha önce gittiği oynatma konumuna geri döndürebilirsiniz. Bu özelliğe "snapback" denir.

Örnek olarak aşağıdaki şemaya bakın. İzleyiciniz bir video izliyor ve 5 dakika ile 15 dakika arasında geçiş yapmaya karar veriyor. Bununla birlikte, 10 dakika sonra içeriği izleyebilmek için önce izlemesini istediğiniz bir reklam arası vardır:

Bu reklam arasını göstermek için aşağıdaki adımları uygulayın:

  1. Kullanıcının izlenmemiş bir reklam arasından atlayan bir arama çalıştırıp çalıştırmadığını kontrol edin. Bu durumda, kullanıcıyı reklam arasına geri götürün.
  2. Reklam arası tamamlandıktan sonra, reklamları asıl konumlarına döndürün.

Diyagram biçiminde, bu şöyle görünür:

Bu iş akışının tvOS IMA SDK'da nasıl uygulanacağı aşağıda açıklanmıştır: AdvancedExample.

Aramanın, reklam arasını izlenmeden bırakmasını önleme

Kullanıcının izlenmemiş bir reklam arasından geçen bir arama gerçekleştirip gerçekleştirmediğini kontrol edin. Bu durumda, kullanıcıyı reklam arasına geri götürün. tvOS gelişmiş örneği, kullanıcının arama yaptığını size bildiren bir yetki verme yöntemine sahip AVPlayerViewController öğesinden yararlanır. Arama başlangıç zamanı önceki reklam arasından önce geliyorsa (yani kullanıcı onu atlamışsa) ve bu ara henüz oynatılmamışsa aranın başlangıç zamanına geri dönersiniz. Ayrıca, başlangıçta istenen isteğin daha sonra kontrol edilmesini istediğiniz başlangıç zamanını ad-break-did-end işleyicinize de kaydedin:

- (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];
    }
  }
}

Kullanıcıyı ilk aradığı yere geri götürmek

Etkinlik yetki verdiğiniz kullanıcıda, önceki reklam arasının "Snapback" sonucunda oynatılıp oynatılmadığını kontrol etmek için AD_BREAK_ENDED destek kaydını değiştirin.


- (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;
  }
}