Tornare a un'interruzione pubblicitaria saltata

Seleziona la piattaforma: HTML5 Android iOS tvOS Roku

In qualità di publisher di video, potresti voler impedire agli spettatori di saltare gli annunci mid-roll. Quando un utente salta un'interruzione pubblicitaria, puoi riportarlo all'inizio dell'interruzione e poi alla posizione che aveva raggiunto dopo che l'interruzione è terminata. Questa funzionalità si chiama "snapback".

Ad esempio, guarda il diagramma riportato di seguito. Lo spettatore sta guardando un video e decide di passare dal minuto 5 al minuto 15. Tuttavia, al minuto 10 è presente un'interruzione pubblicitaria che vuoi che guardi prima di poter guardare i contenuti successivi:

Per mostrare questa interruzione pubblicitaria, segui questi passaggi:

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

Sotto forma di diagramma, si presenta così:

Ecco come implementare lo snapback utilizzando l'SDK IMA DAI, come illustrato in AdvancedExample.

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

Controlla se l'utente ha eseguito una ricerca che ha saltato un'interruzione pubblicitaria non guardata e, in caso affermativo, riportalo all'interruzione pubblicitaria. L'esempio avanzato di tvOS sfrutta AVPlayerViewController, che ha un metodo delegato per comunicarti che l'utente ha eseguito una ricerca. Se l'ora di inizio della ricerca è precedente all'interruzione pubblicitaria precedente (il che significa che l'utente l'ha saltata) e l'interruzione non è ancora stata riprodotta, riporta l'utente all'inizio dell'interruzione pubblicitaria. Inoltre, registra l'ora di inizio della ricerca richiesta inizialmente per controllarla 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 a seguito di uno snapback.


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