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:
- Controlla se l'utente ha eseguito una ricerca che ha superato un'interruzione pubblicitaria non guardata e, in questo caso, riportalo all'interruzione pubblicitaria.
- 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; } }