Intégration publicitaire in-game
Dernière mise à jour : 2026-08-11
Intégrez les formats Banner, interstitiel et rewarded via le bridge hôte PlayNova. Votre jeu s'exécute dans un iframe et communique avec l'hôte via postMessage — n'intégrez pas de SDK publicitaires tiers dans le package.
Comment fonctionne la monétisation
PlayNova remplit les annonces côté hôte et partage les revenus avec les créateurs certifiés (70 % créateur par défaut). Les jeux ne demandent que show/load ; l'hôte gère l'inventaire, les plafonds de fréquence et le reporting impressions/clics.
Enveloppe pour chaque message :
{ "source": "...", "type": "...", "payload": { } }- Les jeux doivent définir
sourceàplaynova-game - L'hôte répond avec
sourceplaynova-host
Formats publicitaires :
- Rewarded — opt-in joueur (revive, double récompense, objet gratuit). Accorder les récompenses uniquement après
ads.rewarded_completed. - Interstitiel — pauses naturelles (niveau terminé / game over). Jamais en pleine saisie.
- Banner — bandeau géré par l'hôte ; le jeu ne demande que show/hide.
Emplacements recommandés
Passez toujours une chaîne placement stable pour analyses et plafonds. Préférez les noms plateforme ci-dessous :
| Placement | Cas d'usage |
|---|---|
revive | Continuer après échec |
double_reward | Bonus fin de niveau |
free_item / unlock | Consommable ou déblocage de contenu |
level_complete / level_start / game_over / pause | Moments interstitiels |
banner_bottom / banner_top | Emplacements Banner |
Flux d'intégration
- À une pause naturelle, appelez
ads.load_*avecplacement(etrequestIdoptionnel). - Attendez
ads.*_loaded(ou gérez*_failedet continuez sans pub). - Appelez
ads.show_*avec le mêmerequestId/placement. - Pour rewarded, modifiez l'état du jeu uniquement sur
ads.rewarded_completed. Sur dismissed/failed, n'accordez pas la récompense.
Types de messages bridge
Les chaînes type canoniques sont définies dans playnova-web (ads-bridge). Alignez votre package jeu sur ces valeurs exactes.
Jeu → hôte
| type | Objectif |
|---|---|
ads.load_rewarded | Précharger l'inventaire rewarded |
ads.show_rewarded | Afficher rewarded (accorder uniquement après completion) |
ads.load_interstitial | Précharger interstitiel |
ads.show_interstitial | Afficher interstitiel à une pause |
ads.show_banner | Demander la visibilité du Banner hôte |
ads.hide_banner | Masquer le Banner hôte |
ads.preload | Précharger plusieurs formats |
ads.get_banner_height | Interroger la hauteur Banner pour la mise en page |
Hôte → jeu
| type | Objectif |
|---|---|
ads.rewarded_loaded | Rewarded prêt à afficher |
ads.rewarded_failed | Échec load/show rewarded |
ads.rewarded_completed | Rewarded terminé — attribution sûre |
ads.rewarded_dismissed | Rewarded fermé tôt — ne pas accorder |
ads.interstitial_loaded | Interstitiel prêt |
ads.interstitial_failed | Échec interstitiel |
ads.interstitial_closed | Interstitiel fermé |
ads.banner_shown | Banner visible |
ads.banner_hidden | Banner masqué |
ads.banner_failed | Échec Banner |
Helper copier-coller
Collez dans votre index.html (ou module). Remplacez l'attribution de récompense par votre logique de jeu.
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);
});
}
// Exemple : flux 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') {
// accorder la récompense UNIQUEMENT ici
}
});Règles de production
- Pas de clic auto, boucle forcée ou masquage des contrôles Close / Skip.
- N'accordez pas de récompense sans
ads.rewarded_completedpour cerequestId. - Respectez les échecs hôte : inventaire vide, continuez le jeu normalement.
- Préférez load avant show pour réduire l'attente au déclenchement.
- Packages sans SDK pub tiers, trackers ou scripts pop-under.
- La fréquence interstitielle est imposée par l'hôte ; le spam show peut être ignoré.
FAQ
Puis-je utiliser AdMob / Unity Ads dans le zip ?
Non. PlayNova agrège la demande côté hôte. Intégrer d'autres SDK échoue la review et casse les hypothèses sandbox iframe.
Et si l'hôte ne répond pas ?
Traitez le silence ou *_failed comme no-fill. Continuez le gameplay sans bloquer le joueur sur un spinner infini.
Où voir les revenus ?
Après mise en prod, impressions et revenus arrivent dans analytics créateur. Règlement selon les conditions du programme créateur.
Le bridge hôte est live sur la page de jeu. Les types de messages ci-dessus sont le contrat production — implémentez-les maintenant.
