Kembali ke jeda iklan yang dilewati

Pilih platform: HTML5 Android iOS tvOS Roku

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

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

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

  1. Periksa apakah pengguna menjalankan pencarian yang melompati jeda iklan yang belum ditonton, dan jika ya, kembalikan mereka ke jeda iklan.
  2. Setelah jeda iklan selesai, kembalikan pengguna ke pencarian aslinya.

Dalam bentuk diagram, tampilannya seperti ini:

Berikut cara menerapkan snapback menggunakan IMA DAI SDK, seperti yang ditunjukkan di AdvancedExample.

Mencegah pencarian keluar dari jeda iklan yang belum ditonton

Periksa apakah pengguna telah menjalankan pencarian yang melewati jeda iklan yang belum ditonton, dan jika ya, bawa mereka kembali ke jeda iklan. Contoh lanjutan tvOS memanfaatkan AVPlayerViewController, yang memiliki metode delegasi untuk memberi tahu Anda bahwa pengguna telah menjalankan penelusuran. Jika waktu mulai pencarian terjadi sebelum jeda iklan sebelumnya (artinya pengguna telah melompati jeda iklan tersebut) dan jeda iklan tersebut belum diputar, kembalikan pengguna ke awal jeda iklan. Selain itu, catat waktu mulai permintaan penelusuran awal untuk diperiksa nanti di handler 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 aslinya

Di delegasi peristiwa, ubah kasus AD_BREAK_ENDED untuk memeriksa apakah jeda iklan sebelumnya diputar sebagai hasil dari kembali ke posisi semula.


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