כבעלי תוכן וידאו, כדאי לכם למנוע מהצופים לדלג על מודעות באמצע הסרטון (mid-roll). כשמשתמש לוחץ ועובר את ההפסקה למודעות, אפשר להחזיר אותם לתחילת ההפסקה למודעות, ואז לחזור אותם למיקום שבו הם מחפשים אחרי שההפסקה למודעות תסתיים. הזה נקראת 'הקפאה'.
דוגמה לכך מופיעה בתרשים הבא. הצופה שלך צופה בסרטון ומחליטה להריץ את נקודת הזמן של 5 דקות עד 15 דקות. עם זאת, יש הפסקה למודעה בדקה של 10 הדקות שרצית כדי לאפשר להם לצפות בתוכן לאחר מכן:
כדי להציג את ההפסקה למודעה הזו, יש לבצע את השלבים הבאים:
- בודקים אם המשתמש ביצע דילוג שעבר על הפסקה למודעה שלא נצפתה, ואם כן, מחזירים אותו להפסקה למודעה.
- כשההפסקה למודעה תסתיים, צריך להחזיר אותם לחיפוש המקורי.
בצורת תרשים, זה נראה כך:
כך תוכלו להטמיע הקשה חוזרת (Snapback) באמצעות IMA DAI SDK, כפי שמוצג ב- AdvancedExample (דוגמה מתקדמת).
מניעת יציאה מהפסקה למודעות שלא נצפה בה
בודקים אם המשתמש ביצע דילוג שחלף הפסקה למודעה שלא נצפה,
ואם כן, החזרו אותם להפסקת המודעות.
הדוגמה המתקדמת ל-tvOS מנצלת את היתרונות של AVPlayerViewController
,
שכולל שיטת הענקת גישה, כדי להודיע לכם שהמשתמש ביצע חיפוש.
אם שעת ההתחלה של הדילוג היא לפני ההפסקה הקודמת למודעות (כלומר
המשתמש דילג עליו) וההפסקה הזו עדיין לא הופעלה,
להחזיר אותם לתחילת ההפסקה למודעות. בנוסף, צריך לתעד את שעת ההתחלה של
בהתחלה נשלחה בקשה לבדוק מאוחר יותר ב-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]; } } }
החזרת המשתמש לחיפוש המקורי
ב-delegate של האירוע, משנים את המקרה AD_BREAK_ENDED
כדי לבדוק אם ההפסקה הקודמת למודעה הופעלה כתוצאה מ-snapback.
- (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; } }