In-game интеграция рекламы
Последнее обновление: 2026-08-11
Интегрируйте Banner, interstitial и rewarded через host bridge PlayNova. Игра работает в iframe и общается с хостом через postMessage — не встраивайте сторонние рекламные SDK в пакет.
Как работает монетизация
PlayNova показывает рекламу на стороне хоста и делит доход с сертифицированными создателями (по умолчанию 70% создателю). Игры только запрашивают show/load; инвентарь, частотные лимиты и отчёты impressions/clicks обрабатывает хост.
Конверт для каждого сообщения:
{ "source": "...", "type": "...", "payload": { } }- Игры должны установить
sourceвplaynova-game - Хост отвечает с
sourceplaynova-host
Форматы рекламы:
- Rewarded — opt-in игрока (revive, двойная награда, бесплатный предмет). Выдавайте награды только после
ads.rewarded_completed. - Interstitial — естественные паузы (уровень пройден / game over). Никогда во время ввода.
- Banner — полоса хоста; игра только запрашивает show/hide.
Рекомендуемые placements
Всегда передавайте стабильную строку placement для аналитики и лимитов. Предпочитайте имена платформы ниже:
| Placement | Сценарий |
|---|---|
revive | Продолжить после провала |
double_reward | Бонус в конце уровня |
free_item / unlock | Расходник или разблокировка контента |
level_complete / level_start / game_over / pause | Моменты interstitial |
banner_bottom / banner_top | Слоты Banner |
Поток интеграции
- На естественной паузе вызовите
ads.load_*сplacement(и опциональнымrequestId). - Дождитесь
ads.*_loaded(или обработайте*_failedи продолжите без рекламы). - Вызовите
ads.show_*с тем жеrequestId/placement. - Для rewarded меняйте состояние игры только на
ads.rewarded_completed. При dismissed/failed не выдавайте награду.
Типы bridge-сообщений
Канонические строки type определены в playnova-web (ads-bridge). Согласуйте пакет игры с этими точными значениями.
Игра → хост
| type | Назначение |
|---|---|
ads.load_rewarded | Предзагрузка rewarded-инвентаря |
ads.show_rewarded | Показ rewarded (награда только после завершения) |
ads.load_interstitial | Предзагрузка interstitial |
ads.show_interstitial | Показ interstitial на паузе |
ads.show_banner | Запрос видимости Banner хоста |
ads.hide_banner | Скрыть Banner хоста |
ads.preload | Предзагрузка нескольких форматов |
ads.get_banner_height | Запрос высоты Banner для layout |
Хост → игра
| type | Назначение |
|---|---|
ads.rewarded_loaded | Rewarded готов к показу |
ads.rewarded_failed | Ошибка load/show rewarded |
ads.rewarded_completed | Rewarded завершён — можно выдать награду |
ads.rewarded_dismissed | Rewarded закрыт рано — не выдавать |
ads.interstitial_loaded | Interstitial готов |
ads.interstitial_failed | Interstitial ошибка |
ads.interstitial_closed | Interstitial закрыт |
ads.banner_shown | Banner виден |
ads.banner_hidden | Banner скрыт |
ads.banner_failed | Banner ошибка |
Helper для копирования
Вставьте в index.html (или модуль). Замените выдачу награды своей логикой игры.
function pnAds(type, payload) {
parent.postMessage({ source: 'playnova-game', type, payload }, '*');
}
function onPnHost(handler) {
window.addEventListener('message', (e) => {
const d = e.data;
if (!d || d.source !== 'playnova-host') return;
handler(d);
});
}
// Пример: поток revive
pnAds('ads.load_rewarded', { placement: 'revive' });
onPnHost((msg) => {
if (msg.type === 'ads.rewarded_loaded') {
pnAds('ads.show_rewarded', {
requestId: msg.payload && msg.payload.requestId,
placement: 'revive',
reward: { type: 'life', amount: 1 },
});
}
if (msg.type === 'ads.rewarded_completed') {
// выдавать награду ТОЛЬКО здесь
}
});Правила production
- Без auto-click, принудительных циклов и скрытия Close / Skip.
- Не выдавайте награды без
ads.rewarded_completedдля этогоrequestId. - Уважайте ошибки хоста: пустой инвентарь — продолжайте игру.
- Предзагружайте перед show, чтобы игрок меньше ждал.
- Пакеты без сторонних рекламных SDK, трекеров и pop-under скриптов.
- Частота interstitial контролируется хостом; spam show может игнорироваться.
FAQ
Можно ли использовать AdMob / Unity Ads в zip?
Нет. PlayNova агрегирует спрос на хосте. Встраивание других SDK провалит review и нарушит iframe sandbox.
Что если хост не отвечает?
Считайте тишину или *_failed как no-fill. Продолжайте игру без бесконечного spinner.
Где смотреть доход?
После запуска рекламы в production impressions и доход идут в аналитику создателя. Расчёты по условиям программы.
Host bridge активен на play-странице. Типы сообщений выше — production-контракт — реализуйте их сейчас.
