قبعة سناباك

بصفتك ناشر فيديو، ننصحك بمنع المشاهدين من البحث عن إعلانات أثناء التشغيل. عندما يتجاوز المستخدم الفاصل الإعلاني، يمكنك إعادته إلى بداية الفاصل الإعلاني، ثم إعادته إلى موضع البحث بعد انتهاء الفاصل الإعلاني. تسمى هذه الميزة "snapback".

اطّلع على الرسم التخطيطي أدناه كمثال. يشاهد المُشاهد مقطع فيديو، ويقرر الانتقال من علامة 5 دقائق إلى علامة 15 دقيقة. مع ذلك، هناك فاصل إعلاني عند بلوغ 10 دقائق تريد أن يشاهده المستخدم قبل أن يتمكّن من مشاهدة المحتوى بعد انتهائه:

لعرض هذا الفاصل الإعلاني، يُرجى اتّباع الخطوات التالية:

  1. تحقَّق مما إذا كان المستخدم قد نفّذ عملية بحث تتجاوز فاصلاً إعلانيًا لم تتم مشاهدته، وفي هذه الحالة، إعادته إلى الفاصل الإعلاني.
  2. بعد اكتمال الفاصل الإعلاني، أعِد عرض الفيديو إلى موضعه الأصلي.

في شكل رسم تخطيطي، يبدو ذلك هكذا:

في ما يلي طريقة تنفيذ سير العمل هذا في حزمة تطوير البرامج لإعلانات الوسائط التفاعلية لنظام التشغيل tvOS، كما هو الحال في AdvancedExample.

منع التقديم أو الترجيع لفاصل إعلاني بدون مشاهدة

تحقَّق مما إذا كان المستخدم قد أجرى عملية بحث تجاوزت فاصلاً إعلانيًا لم تتم مشاهدته، وفي هذه الحالة، أعِد عرضه إلى الفاصل الإعلاني. يستفيد المثال المتقدّم لنظام التشغيل tvOS من AVPlayerViewController، الذي يتضمن طريقة تفويض لإخبارك بأنّ المستخدم قد أجرى عملية بحث. إذا كان وقت بدء التقديم/الترجيع قبل الفاصل الإعلاني السابق (بمعنى أنّ المستخدم تجاوزَ الفاصل الإعلاني) ولم يتم تشغيل هذا الفاصل بعد، يُرجى إعادة الطلب إلى بداية الفاصل الإعلاني. سجِّل أيضًا وقت بدء عملية البحث المطلوبة في البداية للتحقق لاحقًا في معالج 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];
    }
  }
}

إعادة المستخدم إلى موضعه الأصلي

في تفويض الحدث، عدِّل حالة AD_BREAK_ENDED للتحقق مما إذا تم تشغيل الفاصل الإعلاني السابق كنتيجةٍ لإعادة الاتصال.


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