Snapback

Als Video-Publisher möchten Sie vielleicht verhindern, dass Nutzer Ihre Mid-Roll-Anzeigen überspringen. Wenn ein Nutzer nach einer Werbeunterbrechung springt, kannst du ihn an den Beginn der Werbeunterbrechung und nach Abschluss der Werbeunterbrechung zurückholen. Diese Funktion wird als „Snapback“ bezeichnet.

Ein Beispiel sehen Sie im Diagramm unten. Der Zuschauer sieht sich ein Video an und stuft zwischen 5 Minuten und 15 Minuten. Nach 10 Minuten gibt es jedoch eine Werbeunterbrechung, die Nutzer sehen sollen, bevor sie sich den Inhalt danach ansehen können:

So kannst du die Werbeunterbrechung schalten:

  1. Prüfe, ob der Nutzer eine Suche ausgeführt hat, die eine nicht gesehene Werbeunterbrechung überspringt hat. Wenn ja, kehre zur Werbeunterbrechung zurück.
  2. Wenn die Werbeunterbrechung abgeschlossen ist, kehre zur ursprünglichen Suche zurück.

In Diagrammform sieht das so aus:

Im folgenden AdvancedExample wird beschrieben, wie dieser Workflow im IMA SDK von tvOS implementiert wird.

Verhindern, dass eine Suche eine Werbeunterbrechung unbeobachtet verlässt

Prüfe, ob der Nutzer eine Suche ausgeführt hat, die über eine nicht angesehene Werbeunterbrechung hinausgeht. Wenn ja, kehre zur Werbeunterbrechung zurück. Das erweiterte tvOS-Beispiel nutzt den AVPlayerViewController, der über eine Delegate-Methode teilt, dass der Nutzer eine Suche ausgeführt hat. Wenn die Startzeit der Suche vor der vorherigen Werbeunterbrechung liegt, d. h. der Nutzer übersprungen ist, und diese Pause noch nicht abgespielt wurde, springe zurück zum Anfang der Werbeunterbrechung. Notieren Sie sich außerdem die Startzeit der ursprünglich angeforderten Suche in Ihrem ad-break-did-end-Handler:

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

Den Nutzer zu seiner ursprünglichen Suche zurückversetzen

Ändern Sie im Ereignis-Delegaten die Groß-/Kleinschreibung AD_BREAK_ENDED, um zu prüfen, ob die vorherige Werbeunterbrechung infolge des Snapbacks wiedergegeben wurde.


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