可跳过性

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

SDK 将尽最大努力检测当前接收器是否能够直接呈现“跳过”按钮并与之互动。不过,发布商需要通过切换 imaRequestData.senderCanSkip 属性来确定任何附加的发送者是否可以显示可跳过的广告。

在 CAF DAI SDK 的所有示例中,sendcanSkip 会作为媒体对象的一部分直接从发送者传递。这是经过专门简化的实现,适用于单个发送者,但在现实应用中,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 的支持范围内。

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