При первой загрузке страницы с вашей игрой происходит ряд асинхронных событий.
Загружается игровая логика, загружается тег рекламы, начинается инициализация API размещения рекламы, и реклама может быть предварительно загружена. В результате, если вы вызываете adBreak() вскоре после загрузки страницы, существует вероятность, что API не инициализировался или предварительная загрузка рекламы не была завершена. Если API не инициализировался, вызов завершится ошибкой, а если вы зарегистрировали обратный вызов adBreakDone() , breakStatus будет установлен в notReady .
Если вам необходимо синхронизировать логику игры с инициализацией API размещения рекламы, вы можете использовать обратный вызов onReady() для adConfig() .
onReady() вызывается API размещения рекламы, когда:
- тег объявления загружен,
- API размещения рекламы загрузился и инициализировался, и
- Предварительная загрузка рекламы завершена — если вы запросили предварительную загрузку с помощью
adConfig()
На этом этапе 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 автоматически реализует всю необходимую логику предварительной загрузки и тайм-аута. Если вы используете preroll в своей игре, вам не нужно использовать onReady() . Подробнее о preroll
Тайм-ауты
Вызов onReady() не гарантируется, если инициализация API размещения рекламы задерживается или не загружается полностью. Чтобы обеспечить своевременный запуск игры, можно настроить тайм-аут. Если вы получили обратный вызов onReady() , вы можете вызвать adBreak() для размещения рекламы. В противном случае вы можете пропустить вызов ad и продолжить загрузку игры.
Следующий пример включает тайм-аут и аналогичен логике, реализованной при размещении преролла:
...
<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>