Snapback

In qualità di publisher di video, puoi impedire agli spettatori di guardare oltre gli annunci mid-roll. Quando un utente cerca di andare oltre un'interruzione pubblicitaria, puoi riportarlo all'inizio dell'interruzione e riportarlo alla posizione di ricerca al termine dell'interruzione. Questa funzione è chiamata "snapback".

Come esempio, vedi il diagramma seguente. Lo spettatore sta guardando un video e decide di andare dall'indicatore dei 5 minuti a quello dei 15 minuti. Tuttavia, è presente un'interruzione pubblicitaria in corrispondenza dell'indicatore dei 10 minuti in cui vuoi che guardino prima che possano guardare i contenuti successivi:

Per mostrare questa interruzione pubblicitaria, svolgi i seguenti passaggi:

  1. Controlla se l'utente ha eseguito una ricerca che ha superato un'interruzione pubblicitaria non guardata e, in questo caso, riportalo all'interruzione pubblicitaria.
  2. Al termine dell'interruzione pubblicitaria, riporta l'utente alla ricerca originale.

In forma di diagramma, l'aspetto è simile al seguente:

Ecco come implementare questo flusso di lavoro nell'SDK IMA di tvOS, come indicato in AdvancedExample.

Impedire che una ricerca lasci un'interruzione pubblicitaria non guardata

Controlla se l'utente ha eseguito una ricerca che ha superato un'interruzione pubblicitaria non guardata e, in questo caso, riportalo all'interruzione pubblicitaria. L'esempio avanzato di tvOS sfrutta AVPlayerViewController, che ha un metodo delegato per indicare che l'utente ha eseguito una ricerca. Se l'ora di inizio della ricerca precede l'interruzione pubblicitaria precedente (ovvero l'utente ha superato l'interruzione) e l'interruzione non è ancora stata riprodotta, fai in modo che l'utente torni all'inizio dell'interruzione pubblicitaria. Registra inoltre l'ora di inizio della ricerca iniziale richiesta da controllare in un secondo momento nel gestore 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];
    }
  }
}

Riportare l'utente alla ricerca originale

Nel delegato dell'evento, modifica il caso AD_BREAK_ENDED per verificare se l'interruzione pubblicitaria precedente è stata riprodotta come risultato dello snapshot.


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