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

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

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

في جميع نماذج حزمة تطوير البرامج لإدراج إعلان ديناميكي لـ CAF، يتم تمرير sendCanتخط مباشرةً من المرسل، كجزء من كائن الوسائط. وهذا تنفيذ مبسّط عن قصد يفيد مُرسِل واحد، ولكن في التطبيقات الواقعية، قد يتم إرفاق مستقبل 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 الذي يتحقّق مما إذا كان الإعلان قابلاً للتخطّي ولا يمكن للمُرسِلين والمستلمين إتاحة إمكانية التخطّي. ويمكن لهذا المعالج تخطّي هذه الإعلانات تلقائيًا في حال ظهورها. ومع ذلك، فإنّ هذا التنفيذ المتقدّم يتجاوز نطاق إتاحة "إدراج إعلان ديناميكي" في CAF.

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