使用 onReady 手动排定游戏加载顺序

当包含游戏的网页首次加载时,会发生许多异步事件。

游戏逻辑加载,广告代码加载,Ad Placement API 开始初始化,然后会预加载广告。因此,如果您在网页加载后不久即调用 adBreak(),那么 API 可能尚未完成初始化或广告尚未预加载完毕。如果 API 尚未初始化,调用将失败,并且如果您已注册 adBreakDone() 回调,则 breakStatus 将设为 notReady

如果您需要将游戏逻辑与 Ad Placement API 初始化同步,则可以使用针对 adConfig()onReady() 回调。

在以下情况下,Ad Placement API 会调用 onReady()

  • 广告代码加载完毕,
  • Ad Placement API 加载完毕并已初始化,并且
  • 广告已预加载完毕(如果您使用 adConfig() 请求预加载)

此时,Ad Placement API 已完全初始化。您可以调用 adBreak(),它不会返回 notReady 状态。但与往常一样,adBreak() 可能仍不会展示广告(例如,没有可投放的广告)。

以下示例展示了 onReady() 的用法:

...
<script>
    window.adsbygoogle = window.adsbygoogle || [];
    var adBreak = adConfig = function(o) {adsbygoogle.push(o);}
    ...
    function init() {
      // Game start logic, show loading screen
      adConfig({
        preloadAdBreaks: 'on',
        onReady: showAd
      });
      // Don't start the gameplay just yet, keep loading.
    }

    function showAd() {
      // Show an ad
      adBreak({
        type: 'start',
        adBreakDone: startGame,  // always called, unblocks the game logic
        ...
      });
    }
    ...
</script>

注意:最常见的使用情形是在网页加载后不久即调用 adBreak(),以植入前贴片广告。我们强烈建议您使用 preroll 展示位置类型,而不要使用本文所述的方法来创建自己的展示位置。

preroll 会自动实施所有必需的预加载和超时逻辑。如果您在游戏中使用了前贴片广告,则无需使用 onReady()。详细了解前贴片广告

超时

如果 Ad Placement API 初始化延迟或无法完全加载,则不能保证会调用 onReady()。为确保游戏能及时启动,您可能需要设置超时。如果您收到 onReady() 回调,则可以调用 adBreak() 来投放广告,否则您可以跳过广告调用并继续加载游戏。

以下示例包含超时,它类似于前贴片广告展示位置实施的逻辑:

...
<script>
    window.adsbygoogle = window.adsbygoogle || [];
    var adBreak = adConfig = function(o) {adsbygoogle.push(o);}
    ...
    function init() {
        // Game start logic
        let adConfigPromise =
            new Promise((resolve, reject) => adConfig({
                preloadAdBreaks: 'on',
                onReady: () => resolve(true)
            }));
        let timeoutPromise =
            new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve(false);
                }, 2000);
            });
        // Whatever happens first resolves this promise.
        Promise.race([
            adConfigPromise,
            timeoutPromise
        ]).then((shouldShowPreRoll) => {
            if (shouldShowPreRoll) {
                showPreRoll();
            } else {
                startGame();
            }
        });
    }

    function showPreRoll() {
      // Show ad
      adBreak({
          type: 'start',
          adBreakDone: startGame, // always called, unblocks the game logic
          ...
      });
    }
    ...
</script>