當含有遊戲的網頁首次載入時,會發生多個非同步事件。
遊戲邏輯會載入、廣告代碼會載入、Ad Placement API 會開始初始化,且廣告可以預先載入。因此,如果您在網頁載入後不久就呼叫 adBreak(),API 可能尚未初始化,或是廣告尚未完成預先載入。如果 API 尚未初始化,呼叫就會失敗。如果您已註冊 adBreakDone() 回呼,breakStatus 會設為 notReady。
如要將遊戲邏輯與 Ad Placement API 的初始化作業同步處理,可以使用 onReady() 回呼來 adConfig()。
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>