قبعة سناباك

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

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

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

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

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

في ما يلي كيفية تنفيذ سير العمل هذا في حزمة تطوير البرامج لإدراج إعلان ديناميكي لإعلانات الوسائط التفاعلية كما هو الحال في AdvancedExample.

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

تحقَّق مما إذا كان المستخدم قد أجرى عملية بحث تجاوزت فاصلاً إعلانيًا لم تتم مشاهدته، وفي هذه الحالة، أعِد عرضه إلى الفاصل الإعلاني. بالنسبة إلى المثال المتقدّم لنظام التشغيل iOS، يمكنك استخدام تفاعل المستخدم مع واجهة المستخدم الخاصة بك لاكتشاف وقت التشغيل. احتفظ بوقت بدء التقديم/الترجيع للتحقّق مما إذا كان الفيديو قد تجاوز فاصلاً إعلانيًا لم يتم تشغيله في البحث. عندما يصدر المستخدم عناصر التحكّم في الفيديو، قارِن وقته الحالي بوقت آخر فاصل إعلاني. إذا حدث الفاصل الإعلاني بعد وقت بدء التقديم/الترجيع (بمعنى أنّ المستخدم تجاوزه) ولم يتم تشغيله بعد، يجب إعادة توجيه المستخدم إلى بداية الفاصل الإعلاني. اضبط أيضًا علامة العودة إلى النسخة السابقة للتحقّق منها لاحقًا في معالِج اكتمال الفاصل الإعلاني:

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

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

في معالج وضع الفاصل الإعلاني، تحقَّق ممّا إذا تم تشغيل الفاصل السابق كنتيجةٍ لمعاودة الاتصال. إذا كان الأمر كذلك، يمكنك إعادة المستخدم إلى المكان الذي كان يحاول الوصول إليه في البداية (طالما أنه لم يكن في منتصف الفاصل الإعلاني الذي تم تشغيله للتو):

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