可跳过性

使用 CAF DAI SDK 请求和展示可跳过式广告是一项有点复杂的任务,因为这需要确定使用的发送者和接收者的组合是否能够显示“跳过”按钮并与之互动。

SDK 会自动尽最大努力检测当前接收器是否能够直接呈现“跳过”按钮并与之交互。但是,发布商需要通过开启/关闭 imaRequestData.senderCanSkip 属性,确定是否有关联的发件人可以展示可跳过的广告。

在 CAF DAI SDK 的所有示例中, 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 事件附加一个处理程序,用于检查广告是否可跳过,以及发送方和接收方都无法支持可跳过的广告。如果此类广告出现,该处理程序会自动跳过此类广告。不过,这种高级实现超出了 CAF DAI 支持的范围。

默认情况下,如果出现这种极端情况,用户从技术层面来说仍然可以发起跳过,方法是先连接支持可跳过功能的发送者,然后点击显示的“跳过”按钮。