当包含游戏的网页首次加载时,会发生许多异步事件。
游戏逻辑加载,广告代码加载,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>