Snapback

Jako wydawca wideo możesz uniemożliwić widzom przeszukując reklamy w trakcie filmu. Gdy użytkownik przegląda przerwę na reklamę, możesz wrócić do początku przerwy na reklamę, do miejsca, w którym chcesz przewinąć, po zakończeniu przerwy na reklamę. Ten jest nazywany „przyciąganiem”.

Przykład znajdziesz na diagramie poniżej. Widz ogląda film, i postanawia przejść od 5-minutowego filmu do piętnastego. Jednak po 10 minucie reklamy następuje przerwa na reklamę, aby zapoznać się z treścią, zanim obejrzą treść po filmie:

Aby wyświetlić tę przerwę na reklamę, wykonaj te czynności:

  1. Sprawdź, czy użytkownik przeprowadził przewijanie, które przeskoczyło poza nieobejrzaną przerwę na reklamę. Jeśli tak, wróć do przerwy na reklamę.
  2. Po zakończeniu przerwy na reklamę wróć do początkowego przewijania.

Na diagramie wygląda to tak:

Oto jak zaimplementować snapback za pomocą pakietu IMA DAI SDK, jak pokazano w przykładzie zaawansowanym.

Zapobiegaj pozostawaniu przez przewijanie nieobejrzanej przerwy na reklamę

sprawdzić, czy użytkownik przeprowadził przewijanie, które nie minęło od nieobejrzanej przerwy na reklamę; Jeśli tak, wróć do przerwy na reklamę. Przykład zaawansowanego systemu tvOS korzysta z AVPlayerViewController, który udostępnia metodę przekazywania informacji o tym, że użytkownik przeprowadził wyszukiwanie. Jeśli czas rozpoczęcia przewijania przypada przed poprzednią przerwą na reklamę (czyli użytkownik przeskoczył ją obok) i ta przerwa nie została jeszcze odtworzona, przewijają je do początku przerwy na reklamę. Zanotuj również czas rozpoczęcia początkowa prośba o przejście do późniejszego sprawdzenia w module obsługi 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];
    }
  }
}

Przywróć użytkownikowi pierwotne wyszukiwanie

Osobie, której przekazujesz dostęp do wydarzenia, zmień zgłoszenie AD_BREAK_ENDED, aby sprawdzić, czy w wyniku wywołania zwrotnego została odtworzona poprzednia przerwa na reklamę.


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