قبعة سناباك

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

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

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

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

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

في ما يلي طريقة تنفيذ العودة إلى الحالة السابقة باستخدام حزمة تطوير البرامج لإدراج إعلان ديناميكي لإعلانات الوسائط التفاعلية، كما هو موضّح في 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;
  }
}