Snapback

Как издатель видео, вы, возможно, захотите, чтобы ваши зрители не просматривали вашу рекламу в середине ролика. Когда пользователь выполняет поиск после рекламной паузы, вы можете вернуть его к началу этой рекламной паузы, а затем вернуть его в место поиска после завершения рекламной паузы. Эта функция называется «мгновенный возврат».

В качестве примера смотрите диаграмму ниже. Ваш зритель смотрит видео и решает перейти от 5-минутной отметки к 15-минутной отметке. Однако на 10-минутной отметке есть рекламная пауза, которую вы хотите, чтобы они посмотрели, прежде чем они смогут просмотреть контент после нее:

Чтобы показать эту рекламную паузу, выполните следующие действия:

  1. Проверьте, выполнил ли пользователь поиск, который перешел за непросмотренную рекламную паузу, и если да, верните его обратно к рекламной паузе.
  2. После завершения рекламной паузы верните их в исходное положение.

В виде диаграммы это выглядит так:

Ниже описано, как реализовать этот рабочий процесс в IMA DAI SDK, как это сделано в AdvancedExample .

Запретить поиску оставлять рекламную паузу непросмотренной

Проверьте, выполнил ли пользователь поиск после непросмотренной рекламной паузы, и если да, верните его к рекламной паузе. В примере iOS Advanced используйте взаимодействие пользователя с вашим пользовательским интерфейсом, чтобы определить, когда он выполнил поиск. Сохраните время начала поиска, чтобы проверить, не пропустили ли они невоспроизведенную рекламную паузу в своем поиске. Когда пользователь отпускает элементы управления видео, сравните его текущее время со временем последней рекламной паузы. Если рекламная пауза наступает после времени начала поиска (то есть пользователь перепрыгнул ее), и она еще не воспроизводилась, вернитесь к началу рекламной паузы. Кроме того, установите флаг Snapback, чтобы проверить его позже в обработчике завершения рекламной паузы:

- (IBAction)videoControlsTouchStarted:(id)sender {
  self.seekStartTime = self.contentPlayer.currentTime;
}

- (IBAction)videoControlsTouchEnded:(id)sender {
  self.seekEndTime = CMTimeMake(self.progressBar.value, 1);
  IMACuepoint *lastCuepoint =
      [self.streamManager previousCuepointForStreamTime:CMTimeGetSeconds(self.seekEndTime)];
  if (!lastCuepoint.played && (lastCuepoint.startTime > CMTimeGetSeconds(self.seekStartTime))) {
    self.snapbackMode = YES
    // Add 1 to the seek time to get the keyframe at the start of the ad to be your landing place.
    [self.contentPlayer seekToTime:CMTimeMakeWithSeconds(lastCuepoint.startTime + 1, NSEC_PER_SEC)];
  }
}

Верните пользователя к исходному поиску

В обработчике окончания рекламной паузы проверьте, не воспроизводилась ли предыдущая пауза в результате Snapback. Если да, верните пользователя в то место, которое он изначально пытался найти (при условии, что это не была середина только что воспроизведенной рекламной паузы):

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {
  switch (event.type) {
    case kIMAAdEvent_AD_BREAK_ENDED: {
      if (self.snapbackMode) {
        self.snapbackMode = NO;
        if (CMTimeCompare(self.seekEndTime, self.contentPlayer.currentTime)) {
          [self.contentPlayer seekToTime:self.seekEndTime];
        }
      }
      break;
    }
  }
}