Snapback

Sebagai penayang video, Anda mungkin ingin mencegah penonton agar tidak mencari iklan mid-roll Anda. Saat pengguna mencari melewati jeda iklan, Anda dapat mengarahkan mereka kembali ke awal jeda iklan tersebut, lalu mengembalikannya ke lokasi pencarian setelah jeda iklan selesai. Fitur ini disebut "snapback".

Sebagai contoh, lihat diagram di bawah. Penonton Anda sedang menonton video, dan memutuskan untuk mencari dari tanda 5 menit hingga 15 menit. Namun, ada jeda iklan pada tanda 10 menit yang Anda inginkan untuk ditonton sebelum mereka dapat menonton konten setelahnya:

Untuk menampilkan jeda iklan ini, lakukan langkah-langkah berikut:

  1. Periksa apakah pengguna menjalankan pencarian yang melewati jeda iklan yang belum ditonton, dan jika ya, kembalikan ke jeda iklan tersebut.
  2. Setelah jeda iklan selesai, kembalikan ke pencarian awal.

Dalam bentuk diagram, formatnya terlihat seperti ini:

Berikut cara menerapkan alur kerja ini di IMA SDK tvOS, seperti yang dilakukan di AdvancedExample.

Mencegah upaya membuat jeda iklan tidak ditonton

Periksa apakah pengguna telah menjalankan pencarian yang melewati jeda iklan yang belum ditonton, dan jika ya, arahkan mereka kembali ke jeda iklan. Contoh lanjutan tvOS memanfaatkan AVPlayerViewController, yang memiliki metode delegasi untuk memberi tahu Anda bahwa pengguna telah menjalankan pencarian. Jika waktu mulai pencarian terjadi sebelum jeda iklan sebelumnya (artinya pengguna telah melewatinya) dan jeda tersebut belum diputar, cari kembali ke awal jeda iklan. Selain itu, catat waktu mulai pencarian yang awalnya diminta untuk diperiksa nanti di pengendali ad-break-did-end Anda:

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

Mengembalikan pengguna ke pencarian awal

Dalam delegasi peristiwa, ubah kasus AD_BREAK_ENDED untuk memeriksa apakah jeda iklan sebelumnya diputar sebagai hasil dari 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;
  }
}