إمكانية التخطّي

يُعد طلب الإعلانات القابلة للتخطي وعرضها باستخدام SDK لـ CAF DAI مهمة معقدة إلى حد ما، لأنها تتطلب تحديد ما إذا كانت مجموعة المرسلين والمتلقين قيد الاستخدام لديهم القدرة على عرض زر التخطي والتفاعل معه.

ستبذل حزمة تطوير البرامج (SDK) تلقائيًا أفضل الجهود لاكتشاف ما إذا كان المستلِم الحالي لديه القدرة على عرض زر التخطي والتفاعل معه مباشرةً. ومع ذلك، يحتاج الناشر إلى تحديد ما إذا كان يمكن لأي من المُرسِلين المُرفقين عرض إعلانات قابلة للتخطي، وذلك من خلال تبديل السمة imaRequestData.senderCanSkip.

في جميع نماذج SDK لـ DAI لـ CAF، يتم تمرير senderCanSkip مباشرة من المرسل، كجزء من كائن الوسائط. ويُعد هذا تنفيذًا مبسطًا بشكل مدروس يعمل بشكل جيد لمرسل واحد، ولكن في التطبيقات الفعلية قد يتم إرفاق جهاز استقبال CAF بعدة تطبيقات للمرسل، وربما لا يكون المرسل الذي يضع ملف وسائط في قائمة الانتظار متصلًا بعد تحميل كائن الوسائط هذا ويتم إجراء طلب البث.

ويمكن للمستلِم الأكثر تقدمًا تتبُّع أنواع المُرسِلين التابعين التي تدعم التخطّي، وأيّ من المُرسِلين غير التابعين، ويتحقّق في وقت التحميل لمعرفة ما إذا كان المُرسِلون الذين يمكنهم تفعيل الملحق مُرفَقًا حاليًا بالمستلِم.

مثال (مُرسِل واحد):

...

    let getStreamRequest = (request) => {
      const imaRequestData = request.media.customData;
      let streamRequest = null;
      if (imaRequestData.assetKey) {
        // Live stream
        streamRequest = new google.ima.cast.dai.api.LiveStreamRequest();
        streamRequest.assetKey = imaRequestData.assetKey;
      } else if (imaRequestData.contentSourceId) {
        // VOD stream
        streamRequest = new google.ima.cast.dai.api.VODStreamRequest();
        streamRequest.contentSourceId = imaRequestData.contentSourceId;
        streamRequest.videoId = imaRequestData.videoId;
      }
      if (streamRequest && imarequestdata.ApiKey) {
        streamRequest.ApiKey = imarequestdata.ApiKey;
      }
      if (streamRequest && imarequestdata.senderCanSkip) {
        streamRequest.senderCanSkip = imaRequestData.senderCanSkip;
      }
      return streamRequest;
    };
...

مثال (دعم المُرسِلين المتعددين):

...

    let getStreamRequest = (request) => {
      const imaRequestData = request.media.customData;
      let streamRequest = null;
      if (imaRequestData.assetKey) {
        // Live stream
        streamRequest = new google.ima.cast.dai.api.LiveStreamRequest();
        streamRequest.assetKey = imaRequestData.assetKey;
      } else if (imaRequestData.contentSourceId) {
        // VOD stream
        streamRequest = new google.ima.cast.dai.api.VODStreamRequest();
        streamRequest.contentSourceId = imaRequestData.contentSourceId;
        streamRequest.videoId = imaRequestData.videoId;
      }
      if (streamRequest && imarequestdata.ApiKey) {
        streamRequest.ApiKey = imarequestdata.ApiKey;
      }

      let senders = castContext.getSenders();
      let senderCanSkip = (sender) => {
        const skippableUserAgents = [
          "iOS CastSDK",
          "Android CastSDK"
        ];
        // trim user agent to just include device
        let userAgent = sender.userAgent.explode(',')[0];
        return skippableUserAgents.includes(userAgent);
      };
      if (streamRequest && senders.some(senderCanSkip)) {
        streamRequest.senderCanSkip = imarequestdata.senderCanSkip;
      }
      return streamRequest;
    };

...

في نهاية الأمر، يتحمّل الناشرون مسؤولية تجربة المستخدمين لديهم، وبما أنّه من الممكن إلغاء اتصال جميع المُرسِلين القابلين للتخطّي بين وقت إجراء طلب البث ووقت تشغيل الإعلان، قد ترغب في إرفاق معالج بالحدث STARTED الذي سيتحقّق مما إذا كان الإعلان قابلاً للتخطي ولن يتمكّن المُرسِلون والمُستلِم من دعم قابلية التخطّي. ويمكن لهذا المعالج تخطي هذه الإعلانات تلقائيًا في حال ظهورها. ومع ذلك، فإن هذا التنفيذ المتقدم يتجاوز نطاق دعم CAI DAI.

في حالة حدوث مثل هذه الحالة القصوى، لا يزال المستخدم قادرًا من الناحية التقنية على بدء التخطّي، وذلك من خلال توصيل مُرسِل يدعم قابلية التخطّي أولاً ثم النقر على زر التخطّي الذي يظهر.