חזרה להפסקה למודעה שדילגתם עליה

הפלטפורמה: HTML5 Android iOS tvOS Roku

מוציאים לאור של סרטונים יכולים לרצות למנוע מהצופים לדלג על מודעות באמצע הסרטון. כשמשתמש מדלג מעבר להפסקת פרסום, אפשר להחזיר אותו לתחילת הפסקת הפרסום הזו, ואז להחזיר אותו למיקום הדילוג אחרי שההפסקה מסתיימת. התכונה הזו נקראת 'חזרה מהירה'.

לדוגמה, ראו את התרשים הבא. הצופה צופה בסרטון ומחליט לדלג מנקודת הזמן של 5 דקות לנקודת הזמן של 15 דקות. עם זאת, יש הפסקת פרסומות אחרי 10 דקות צפייה, ואתם רוצים שהצופים יצפו בה לפני שהם יוכלו לצפות בתוכן שאחריה:

כדי להציג את ההפסקה המסחרית הזו, פועלים לפי השלבים הבאים:

  1. בודקים אם המשתמש הפעיל מעבר מהיר שדילג על הפסקת פרסום שהוא לא צפה בה, ואם כן, מחזירים אותו להפסקת הפרסום.
  2. אחרי שהפסקת הפרסום מסתיימת, מחזירים את הצופים למיקום המקורי בסרטון.

בתרשים, זה נראה כך:

כך מטמיעים את התכונה 'חזרה מהירה' באמצעות IMA DAI SDK, כמו שמוצג ב-AdvancedExample.

איך מונעים מעבר מהיר קדימה שגורם לדילוג על הפסקה למודעה

בודקים אם המשתמש הפעיל מעבר מהיר קדימה שדילג על הפסקת פרסום שהוא לא צפה בה, ואם כן, מחזירים אותו להפסקת הפרסום. בדוגמה המתקדמת של tvOS נעשה שימוש ב-AVPlayerViewController, שכולל שיטת delegate שמודיעה לכם שהמשתמש הפעיל מעבר למיקום אחר בסרטון. אם זמן ההתחלה של ההרצה קדימה חל לפני ההפסקה הקודמת לפרסומות (כלומר, המשתמש דילג מעליה) וההפסקה הזו עדיין לא הופעלה, צריך להחזיר את המשתמש לתחילת ההפסקה לפרסומות. בנוסף, צריך לתעד את שעת ההתחלה של הבקשה הראשונית למעבר למיקום מסוים כדי לבדוק אותה מאוחר יותר ב-handler של 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;
  }
}