Snapback

In qualità di publisher di video, potresti voler impedire agli spettatori di che cerca oltre gli annunci mid-roll. Quando un utente va oltre un'interruzione pubblicitaria, puoi riportarli all'inizio dell'interruzione pubblicitaria e poi tornare alla loro posizione di ricerca al termine dell'interruzione pubblicitaria. Questo è chiamata "snapback".

Osserva il diagramma seguente come esempio. Lo spettatore sta guardando un video e decide di andare dal minuto 5 al minuto 15. C'è, tuttavia, un'interruzione pubblicitaria al contrassegno dei 10 minuti che vorresti prima di poter guardare i contenuti successivi:

Per visualizzare questa interruzione pubblicitaria:

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

Il diagramma ha il seguente aspetto:

Ecco come implementare lo snapshot utilizzando l'SDK IMA DAI, come dimostrato in AdvancedExample.

Impedire a una ricerca di lasciare un'interruzione pubblicitaria non guardata

Controlla se l'utente ha eseguito una ricerca successiva a un'interruzione pubblicitaria non guardata e, in questo caso, riportali 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 l'ha saltato) e quella pausa non è stata ancora riprodotta, cercalo di nuovo fino all'inizio dell'interruzione pubblicitaria. Inoltre, prendi nota dell'ora di inizio richiesto inizialmente cercare di 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];
    }
  }
}

Riporta l'utente alla ricerca originale

Nel delegato dell'evento, modifica la richiesta 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;
  }
}