スキップ設定

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 のサポート範囲外です。

デフォルトでは、このようなエッジケースが発生した場合でも、ユーザーはスキップ可能をサポートする送信者を最初に接続してから、表示されるスキップボタンをクリックすると、スキップを開始できます。