En tant qu'éditeur de vidéos, vous souhaitez peut-être empêcher les internautes de rechercher vos annonces mid-roll. Lorsqu'un utilisateur recherche après une coupure publicitaire, vous pouvez le ramener au début de celle-ci, puis le renvoyer à son emplacement de recherche une fois la coupure publicitaire terminée. Cette fonctionnalité s'appelle "snapback".
À titre d'exemple, consultez le schéma ci-dessous. Lorsqu'un spectateur regarde une vidéo, il décide de s'étendre sur une période allant de 5 minutes à 15 minutes. En revanche, vous souhaitez qu'ils regardent une coupure publicitaire au bout de 10 minutes avant de pouvoir regarder le contenu suivant:
Pour diffuser cette coupure publicitaire, procédez comme suit:
- Vérifiez si l'utilisateur a exécuté une recherche qui a dépassé une coupure publicitaire non visionnée et, le cas échéant, renvoyez-le à la coupure.
- Une fois la coupure publicitaire terminée, rétablissez la recherche d'origine.
Sous forme de diagramme, cela ressemble à ceci:
Voici comment implémenter ce workflow dans le SDK IMA pour tvOS, comme indiqué dans la section AdvancedExample.
Empêcher une recherche de laisser une coupure publicitaire non visionnée
Vérifiez si l'utilisateur a effectué une recherche après une coupure publicitaire non visionnée et, le cas échéant, redirigez-le vers la coupure.
L'exemple avancé tvOS tire parti de AVPlayerViewController
, qui dispose d'une méthode déléguée pour vous indiquer que l'utilisateur a exécuté une recherche.
Si l'heure de début de la recherche est antérieure à la précédente coupure publicitaire (c'est-à-dire si l'utilisateur l'a passée) et que cette coupure n'a pas encore été lue, recherchez-la jusqu'au début de la coupure. Notez également l'heure de début de la recherche à vérifier ultérieurement dans votre gestionnaire 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]; } } }
Revenir à la recherche initiale de l'utilisateur
Dans votre délégué d'événement, modifiez le cas AD_BREAK_ENDED
pour vérifier si la coupure publicitaire précédente a été lue à la suite du retour arrière.
- (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; } }