Esempio di implementazione

L'API Ad Placement è progettata per supportare gli sviluppatori AdSense e AdMob che utilizzano annunci interstitial e con premio nei giochi HTML5 sul web o all'interno delle app. Questo esempio mostra come integrare l'API Ad Placement in un gioco e utilizzarla per inserire un annuncio interstitial.

Prerequisiti

Prima di iniziare, sarà necessario:

  • Creare due file vuoti nella stessa directory:
    • index.html
    • game.js
  • Installare Python localmente o utilizzare un server web per testare l'implementazione

Codice campione dell'app

Gli editori AdMob possono scaricare il codice dell'app di esempio per comprendere meglio come integrare l'API in un gioco per app.

Scarica il codice campione dell'app

1. Avviare un server di sviluppo

Poiché l'API Ad Placement carica le dipendenze tramite lo stesso protocollo della pagina su cui viene caricata, devi utilizzare un web server per testare la tua app. Puoi utilizzare il server integrato di Python per creare un ambiente di sviluppo locale.

  1. Apri il terminale.

  2. Vai alla directory che contiene il file index.html, quindi esegui:

    python -m http.server 8000
    
  3. In un browser web, vai su localhost:8000.

Puoi anche utilizzare qualsiasi altro server web, ad esempio Apache HTTP Server.

2. Creare un gioco HTML5

Modifica index.html per creare un elemento canvas HTML5 e un pulsante per attivare il gioco. Quindi, aggiungi il tag di script necessario per caricare il file game.js.

index.html

<!doctype html>
<html lang="en">
  <head>
    <title>Ad Placement API HTML5 demo</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <canvas id="gameContainer" height="300px" width="300px"></canvas>
    <br>
    <button id="playButton">Play</button>
    <button style="display:none" id="headsButton">Heads</button>
    <button style="display:none" id="tailsButton">Tails</button>

    <script src="game.js"></script>
  </body>
</html>

Modifica game.js per giocare a testa o croce quando viene fatto clic sul pulsante "Gioca".

game.js

// Create a coin flip game
class Game {
  constructor() {
    // Define variables
    this.score = 0;
    this.choice = '';

    this.canvas = document.getElementById('gameContainer').getContext('2d');
    this.canvas.font = '24px Arial';

    this.playButton = document.getElementById('playButton');
    this.headsButton = document.getElementById('headsButton');
    this.tailsButton = document.getElementById('tailsButton');

    // On click listeners for the game's buttons.
    this.playButton.addEventListener('click', () => {
      this.erase();
      this.play();
    });

    this.headsButton.addEventListener('click', () => {
      this.choice = 'Heads';
      this.flipCoin();
    });

    this.tailsButton.addEventListener('click', () => {
      this.choice = 'Tails';
      this.flipCoin();
    });

    this.erase();
  }

  // Start the game
  play() {
    this.score = 0;
    this.canvas.fillText('Score: ' + this.score, 8, 26);
    this.canvas.fillText('Heads or Tails?', 66, 150);
    this.playButton.style.display = 'none';
    this.headsButton.style.display = 'inline-block';
    this.tailsButton.style.display = 'inline-block';
  }

  // Flip the coin
  flipCoin() {
    this.headsButton.disabled = true;
    this.tailsButton.disabled = true;
    this.erase();
    this.canvas.fillText('Score: ' + this.score, 8, 26);
    this.canvas.fillText('Flipping coin . . .', 60, 150);

    setTimeout(() => { this.coinLanded() }, 2000);
  }

  // Logic for when the coin lands
  coinLanded() {
    this.headsButton.disabled = false;
    this.tailsButton.disabled = false;
    let sideUp;
    if(Math.random() < 0.5) {
      sideUp = 'Heads';
    } else {
      sideUp = 'Tails';
    }

    if (sideUp === this.choice ) {
      this.win(sideUp);
    } else {
      this.lose(sideUp);
    }
  }

  // Guess the flip correctly
  win(sideUp) {
    this.erase();
    this.score += 1;
    this.canvas.fillText('Score: ' + this.score, 8, 26);
    this.canvas.fillText('It was ' + sideUp + '!', 66, 150);
    this.canvas.fillText('Guess again', 70, 200);
  }

  // Guess the flip incorrectly
  lose(sideUp) {
    this.erase();
    this.canvas.fillText('Sorry, it was ' + sideUp, 50, 100);
    this.canvas.fillText('Your score was ' + this.score, 50, 150);
    this.canvas.fillText('Want to play again?', 45, 200);

    this.playButton.style.display = 'inline-block';
    this.headsButton.style.display = 'none';
    this.tailsButton.style.display = 'none';
  }

  // Erase the canvas
  erase() {
    this.canvas.fillStyle = '#ADD8E6';
    this.canvas.fillRect(0, 0, 300, 300);
    this.canvas.fillStyle = '#000000';
  }
}

const game = new Game();

Dopo aver completato questo passaggio, quando apri index.html nel browser (tramite il server di sviluppo), dovresti vedere il canvas del gioco e il pulsante "Gioca". Se fai clic su Gioca, dovrebbe iniziare il gioco del lancio della moneta.

3. Importare l'API Ad Placement

Aggiungi l'API Ad Placement al gioco inserendo un tag di script in index.html, prima del tag per game.js.

Il tag di script può accettare una serie di parametri. Utilizzeremo i seguenti parametri per specificare il codice proprietà AdSense e per attivare la modalità di test:

  • data-ad-client=<AdSense property code> Il codice proprietà AdSense. È sempre obbligatorio anche per i giochi che verranno eseguiti all'interno delle app.
  • data-adbreak-test="on" Attiva la modalità di test. Rimuovi questo elemento per i giochi una volta che vengono pubblicati per i giocatori.

Configurare il codice AdSense e attivare la modalità di test

La funzionalità dell'API Ad Placement è inclusa nel codice AdSense. Per attivarlo, devi prima aggiungere il codice AdSense e includere un piccolo snippet di script che inizializza le due funzioni chiave: adBreak() e adConfig().

index.html (web)

 [...]
    <canvas id="gameContainer" height="300px" width="300px"></canvas>
    <br>
    <button id="playButton">Play</button>
    <button style="display:none" id="headsButton">Heads</button>
    <button style="display:none" id="tailsButton">Tails</button>

    <script async
      data-adbreak-test="on"
      src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-123456789"
      crossorigin="anonymous">
    </script>
    <script>
      window.adsbygoogle = window.adsbygoogle || [];
      const adBreak = adConfig = function(o) {adsbygoogle.push(o);}
    </script>
    <script src="game.js"></script>
  </body>
</html>

Incorporamento del gioco (facoltativo)

Se vuoi incorporare un gioco in altre pagine all'interno di un iframe e il tag adsbygoogle si trova nella pagina HTML del gioco, assicurati di aggiungere allow='autoplay' all'elemento iframe. Si tratta di una best practice ed è necessaria per l'idoneità di determinati annunci al tuo gioco.

<head>
  <!-- The adsbygoogle tag is not here -->
</head>
<body>
  <iframe src="https://www.my-game.com" title="My game" allow="autoplay">
    <!-- The game is loaded here and contains the adsbygoogle tag -->
  </iframe>
</body>

Supportare le app mobile

Un gioco H5 può essere eseguito in un normale browser web, in un WebView o in una scheda personalizzata di Chrome all'interno di un'app. L'API Ad Placement può rilevare l'ambiente in cui viene eseguito il gioco e indirizzare le richieste di annunci in modo appropriato. Se il gioco viene eseguito in un normale browser web, le richieste di annunci vengono trattate come normali richieste AdSense. Se l'API Ad Placement rileva un ambiente in-app, comunica con l'SDK Google Mobile Ads, se presente, per richiedere e mostrare gli annunci AdMob.

Questa funzionalità è supportata nelle app per Android collegate all'SDK Google Mobile Ads. Per attivarlo, devi registrare il WebView che mostrerà il tuo gioco con l'SDK Google Mobile Ads, quindi configurare le unità pubblicitarie AdMob e trasmetterle come parametri aggiuntivi al tag AdSense. Quando il tuo gioco viene eseguito all'interno di un'app adatta, l'API Ad Placement utilizzerà queste unità pubblicitarie per mostrare gli annunci.

Per attivare il supporto mobile, devi specificare i seguenti parametri del tag aggiuntivi:

  • data-admob-interstitial-slot=<AdMob slot ID> Un ID unità pubblicitaria interstitial AdMob che hai configurato in precedenza.
  • data-admob-rewarded-slot=<AdMob slot ID> Un ID unità pubblicitaria con premio AdMob.

Il codice proprietà AdSense deve sempre essere trasmesso con il parametro data-ad-client e deve essere specificato almeno uno tra data-admob-interstitial-slot e data-admob-rewarded-slot. Entrambi i parametri devono essere specificati se il gioco utilizza entrambi i formati.

Se vuoi, puoi anche specificare il parametro del tag data-admob-ads-only=on per indicare che il tuo gioco deve mostrare annunci solo di AdMob e non eseguire il fallback ad AdSense nei casi in cui il gioco viene riprodotto in un ambiente che non supporta le richieste AdMob (ad es. ambienti non app o app senza l'SDK Google Mobile Ads configurato).

Importante: quando progetti il gioco affinché venga incorporato in un'app e sei proprietario dell'app o se stai stipulato un contratto di compartecipazione alle entrate con il proprietario dell'app, l'unico modo per farlo in un metodo molto efficace e conforme alle norme consiste nell'utilizzare l'assistenza AdMob.

Per prima cosa, registra la WebView che mostrerà il tuo gioco con l'SDK Google Mobile Ads:

MainActivity.java (app)

Le impostazioni predefinite di WebView non sono ottimizzate per gli annunci. Utilizza le API WebSettings per configurare WebView per:

  • JavaScript
  • Accesso allo spazio di archiviazione locale
  • Riproduzione automatica dei video

Java

import android.webkit.CookieManager;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {
  private WebView webView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    webView = findViewById(R.id.webview);

    // Let the web view accept third-party cookies.
    CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
    // Let the web view use JavaScript.
    webView.getSettings().setJavaScriptEnabled(true);
    // Let the web view access local storage.
    webView.getSettings().setDomStorageEnabled(true);
    // Let HTML videos play automatically.
    webView.getSettings().setMediaPlaybackRequiresUserGesture(false);

    // Set the H5AdsWebViewClient.
    h5AdsWebViewClient = new H5AdsWebViewClient(this, webView);
    webView.setWebViewClient(h5AdsWebViewClient);
    h5AdsWebViewClient.setDelegateWebViewClient(pubWebViewClient);

    // Register the web view.
    MobileAds.registerWebView(webView);
  }
}

Kotlin

import android.webkit.CookieManager
import android.webkit.WebView

class MainActivity : AppCompatActivity() {
  lateinit var webView: WebView

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    webView = findViewById(R.id.webview)

    // Let the web view accept third-party cookies.
    CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true)
    // Let the web view use JavaScript.
    webView.settings.javaScriptEnabled = true
    // Let the web view access local storage.
    webView.settings.domStorageEnabled = true
    // Let HTML videos play automatically.
    webView.settings.mediaPlaybackRequiresUserGesture = false

    // Set the H5AdsWebViewClient.
    val h5AdsWebViewClient = H5AdsWebViewClient(this, webView)
    webView.webViewClient = h5AdsWebViewClient
    h5AdsWebViewClient.delegateWebViewClient = pubWebViewClient

    // Register the web view.
    MobileAds.registerWebView(webView)
  }
}

Successivamente, passa le unità pubblicitarie AdMob (una per gli interstitial e una per gli annunci con premio) come segue:

index.html (app)

 [...]
    <canvas id="gameContainer" height="300px" width="300px"></canvas>
    <br>
    <button id="playButton">Play</button>
    <button style="display:none" id="headsButton">Heads</button>
    <button style="display:none" id="tailsButton">Tails</button>
    <script async
      data-admob-interstitial-slot="ca-app-pub-0987654321/1234567890"
      data-admob-rewarded-slot="ca-app-pub-0987654321/0987654321"
      src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-123456789"
      crossorigin="anonymous">
    </script>
    <script>
      window.adsbygoogle = window.adsbygoogle || [];
      const adBreak = adConfig = function(o) {adsbygoogle.push(o);}
    </script>
    <script src="game.js"></script>
  </body>
</html>

4. Effettuare una chiamata a adConfig()

La chiamata adConfig() comunica la configurazione attuale del gioco all'API Ad Placement. L'API può quindi utilizzare queste informazioni per filtrare i tipi di annunci che richiede in modo che siano adatti al gioco (ad esempio annunci video che richiedono l'audio, se è attivato).

Una chiamata deve essere effettuata a adConfig() ogni volta che questa configurazione cambia, ad esempio quando un utente disattiva o riattiva l'audio del gioco. Chiama adConfig() nel costruttore del gioco, quindi aggiungi un pulsante per disattivare e riattivare l'audio del gioco che effettua una chiamata adConfig() aggiuntiva.

game.js

class Game {
  constructor() {
    // Define variables
    this.score = 0;
    this.choice = '';
    this.muted = false;

    this.canvas = document.getElementById('gameContainer').getContext('2d');
    this.canvas.font = '24px Arial';

    this.playButton = document.getElementById('playButton');
    this.headsButton = document.getElementById('headsButton');
    this.tailsButton = document.getElementById('tailsButton');
    this.muteButton = document.getElementById('muteButton');

    adConfig({
      sound: 'on',
    });

    // On click listeners for the game's buttons.
    this.playButton.addEventListener('click', () => {
      this.erase();
      this.play();
    });

    this.headsButton.addEventListener('click', () => {
      this.choice = 'Heads';
      this.flipCoin();
    });

    this.tailsButton.addEventListener('click', () => {
      this.choice = 'Tails';
      this.flipCoin();
    });

    this.muteButton.addEventListener('click', () => {
      var soundString = this.muted ? 'on' : 'off';
      this.muteButton.innerHTML = this.muted ? 'Mute sound' : 'Un-mute sound';
      this.muted = !this.muted;
      adConfig({
        sound: soundString,
      });
    });

    this.erase();
  [...]

Ora aggiungi il pulsante Mute al file HTML.

index.html

[...]
    <canvas id="gameContainer" height="300px" width="300px"></canvas>
    <br>
    <button id="playButton">Play</button>
    <button style="display:none" id="headsButton">Heads</button>
    <button style="display:none" id="tailsButton">Tails</button>
    <button id="muteButton">Mute sound</button>

    <script async
      data-adbreak-test="on"
      src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-123456789"
      crossorigin="anonymous">
    </script>
[...]

5. Fare una chiamata a adBreak() al termine della partita

La chiamata adBreak() definisce un posizionamento dell'annuncio e accetta l'oggetto chiamato configurazione del posizionamento che specifica tutto ciò che è necessario per mostrare un annuncio in questo punto del gioco. Il supporto di diversi tipi di annunci richiede l'inizializzazione di diversi sottoinsiemi della configurazione del posizionamento.

La chiamata adBreak() definisce un posizionamento in cui potrebbe essere visualizzato un annuncio o, in altre parole, un'opportunità per mostrare un annuncio. La visualizzazione effettiva di un annuncio dipende da una serie di fattori:

  • Il tipo di posizionamento dell'annuncio che hai dichiarato.
  • Se si sono verificate interazioni utente idonee prima del posizionamento dell'annuncio.
  • Indica se esiste un annuncio adatto per il giocatore corrente che:
    • È pertinente per lui.
    • È coerente con le impostazioni di consenso e privacy dei dati.
  • Il numero di annunci visualizzati di recente dall'utente.
  • Le impostazioni di controllo che hai configurato per questo gioco come:
    • Suggerimenti nel tag.
    • In AdSense (nota: i controlli disponibili in AdSense si evolveranno nel tempo)

Aggiungi il codice per la visualizzazione di un annuncio interstitial al riavvio del gioco: effettua una chiamata a adBreak() all'interno della funzione play(), che viene eseguita solo dopo che il gioco è stato giocato una volta.

adBreak() deve essere chiamato nell'ambito di un'azione dell'utente, ad esempio il clic sul pulsante "Riproduci", altrimenti l'API non sarà in grado di richiedere e mostrare gli annunci.

Crea funzioni da chiamare prima e dopo l'interruzione pubblicitaria, che poi utilizzerai nella configurazione del posizionamento adBreak(). È importante notare che le funzioni beforeAd e afterAd verranno chiamate solo se viene trovato un annuncio adatto.

game.js

class Game {
  constructor() {
    // Define variables
    this.score = 0;
    this.choice = '';
    this.muted = false;
    this.shouldShowAdOnPlay = false;

  [...]

  // Start the game
  play() {
    if (this.shouldShowAdOnPlay) {
      this.shouldShowAdOnPlay = false;

      adBreak({
        type: 'next',  // ad shows at start of next level
        name: 'restart-game',
        beforeAd: () => { this.disableButtons(); },  // You may also want to mute the game's sound.
        afterAd: () => { this.enableButtons(); },    // resume the game flow.
      });
    }

    this.score = 0;
    this.canvas.fillText('Score: ' + this.score, 8, 26);
    this.canvas.fillText('Heads or Tails?', 66, 150);
    this.playButton.style.display = 'none'
    this.headsButton.style.display = 'inline-block'
    this.tailsButton.style.display = 'inline-block'
  }

  [...]

  // Guess the flip incorrectly
  lose(sideUp) {
    this.erase()
    this.canvas.fillText('Sorry, it was ' + sideUp, 50, 100);
    this.canvas.fillText('Your score was ' + this.score, 50, 150);
    this.canvas.fillText('Want to play again?', 45, 200);

    this.playButton.style.display = 'inline-block'
    this.headsButton.style.display = 'none'
    this.tailsButton.style.display = 'none'
    this.shouldShowAdOnPlay = true;
  }

  [...]

  // Erase the canvas
  erase() {
    this.canvas.fillStyle = '#ADD8E6';
    this.canvas.fillRect(0, 0, 300, 300);
    this.canvas.fillStyle = '#000000';
  }

  enableButtons() {
    this.playButton.disabled = false;
    this.headsButton.disabled = false;
    this.tailsButton.disabled = false;
  }

  disableButtons() {
    this.playButton.disabled = true;
    this.headsButton.disabled = true;
    this.tailsButton.disabled = true;
  }
}

const game = new Game();

6. Effettuare una chiamata a adBreak() per un annuncio con premio

Aggiungi il codice per la visualizzazione di un annuncio con premio al termine della partita, ma l'utente vorrebbe ripristinare il punteggio esistente anziché ricominciare da capo. Effettua una chiamata a adBreak() all'interno della funzione lose(), verificando se è disponibile un annuncio con premio. In caso affermativo, mostra all'utente un prompt che gli chiede se vuole la ricompensa (ovvero la rianimazione in questo caso) e, quando accetta di guardare l'annuncio, chiama il showAdFn() corrispondente. Puoi configurare cosa fare se l'utente guarda/salta gli annunci con premio utilizzando i callback adViewed e adDismissed.

Un nuovo adBreak() deve essere chiamato per ogni opportunità di mostrare un annuncio con premio. In questo modo, l'annuncio viene aggiornato se quello precedente è scaduto o non era disponibile.

showAdFn() deve essere chiamato nell'ambito di un'azione diretta dell'utente per guardare un annuncio, altrimenti l'annuncio potrebbe non essere visualizzato.

Crea funzioni da chiamare prima e dopo l'interruzione pubblicitaria, che poi utilizzerai nella configurazione del posizionamento adBreak(). È importante notare che le funzioni beforeReward, adViewed, adDismissed, beforeAd e afterAd verranno chiamate solo se viene trovato un annuncio idoneo.

game.js

class Game {
  constructor() {
    // Define variables
    this.score = 0;
    this.choice = '';
    this.muted = false;
    this.shouldShowAdOnPlay = false;
    this.showRewardedAdFn = null;

    this.canvas = document.getElementById('gameContainer').getContext('2d');
    this.canvas.font = '24px Arial';

    this.playButton = document.getElementById('playButton');
    this.headsButton = document.getElementById('headsButton');
    this.tailsButton = document.getElementById('tailsButton');
    this.muteButton = document.getElementById('muteButton');
    this.continueButton = document.getElementById('continueButton');

    adConfig({
      sound: 'on',
    });

    // On click listeners for the game's buttons.
    this.playButton.addEventListener('click', () => {
      this.erase();
      this.play();
    });

    this.headsButton.addEventListener('click', () => {
      this.choice = 'Heads';
      this.flipCoin();
    });

    this.tailsButton.addEventListener('click', () => {
      this.choice = 'Tails';
      this.flipCoin();
    });

    this.muteButton.addEventListener('click', () => {
      var soundString = this.muted ? 'on' : 'off';
      this.muteButton.innerHTML = this.muted ? 'Mute sound' : 'Un-mute sound';
      this.muted = !this.muted;
      adConfig({
        sound: soundString,
      });
    });

    this.continueButton.addEventListener('click', () => {
      if (this.showRewardedAdFn) {
        this.showRewardedAdFn();
      }
    });

    this.erase();
  }

  // Start the game
  play() {
    if (this.shouldShowAdOnPlay) {
      this.shouldShowAdOnPlay = false;

      adBreak({
        type: 'next',  // ad shows at start of next level
        name: 'restart-game',
        beforeAd: () => { this.disableButtons(); },  // You may also want to mute the game's sound.
        afterAd: () => { this.enableButtons(); },    // resume the game flow.
      });
    }

    this.score = 0;
    this.canvas.fillText('Score: ' + this.score, 8, 26);
    this.canvas.fillText('Heads or Tails?', 66, 150);
    this.playButton.style.display = 'none';
    this.continueButton.style.display = 'none';
    this.headsButton.style.display = 'inline-block';
    this.tailsButton.style.display = 'inline-block';
  }

  [...]

  // Guess the flip incorrectly
  lose(sideUp) {
    this.erase()
    this.canvas.fillText('Sorry, it was ' + sideUp, 50, 100);
    this.canvas.fillText('Your score was ' + this.score, 50, 150);
    this.canvas.fillText('Want to play again?', 45, 200);

    this.playButton.style.display = 'inline-block'
    this.headsButton.style.display = 'none'
    this.tailsButton.style.display = 'none'
    this.shouldShowAdOnPlay = true;

    adBreak({
      type: 'reward',  // rewarded ad
      name: 'reward-continue',
      beforeReward: (showAdFn) => {
        this.showRewardedAdFn = () => { showAdFn(); };
        // Rewarded ad available - prompt user for a rewarded ad
        this.continueButton.style.display = 'inline-block';
      },
      beforeAd: () => { this.disableButtons(); },     // You may also want to mute the game's sound.
      adDismissed: () => {
        this.continueButton.style.display = 'none';   // Hide the reward button and continue lose flow.
      },
      adViewed: () => { this.continueGame(); },       // Reward granted - continue game at current score.
      afterAd: () => { this.enableButtons(); },       // Resume the game flow.
    });
  }

  // Continue gameplay at current score
  continueGame() {
    this.erase();
    this.canvas.fillText('Score: ' + this.score, 8, 26);
    this.canvas.fillText('Heads or Tails?', 66, 150);
    this.playButton.style.display = 'none';
    this.continueButton.style.display = 'none';
    this.headsButton.style.display = 'inline-block';
    this.tailsButton.style.display = 'inline-block';
  }
  [...]
}

const game = new Game();

Ora aggiungi il pulsante Continua al file HTML.

index.html

[...]
    <canvas id="gameContainer" height="300px" width="300px"></canvas>
    <br>
    <button id="playButton">Play</button>
    <button style="display:none" id="headsButton">Heads</button>
    <button style="display:none" id="tailsButton">Tails</button>
    <button style="display:none" id="continueButton">Watch Ad to continue?</button>
    <button id="muteButton">Mute sound</button>

    <script async
      data-adbreak-test="on"
      src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-123456789"
      crossorigin="anonymous">
    </script>
[...]

L'app per il lancio della moneta ora crea posizionamenti degli annunci per la visualizzazione degli annunci.

La tua app potrebbe avere posizioni aggiuntive e appropriate per gli annunci, oltre a quelle alla fine della partita. La chiamata di adBreak() in questi luoghi dovrebbe essere simile a questo esempio.

Disattivare i test per le app di produzione

Prima di rilasciare l'app, è importante rimuovere o commentare la riga data-adbreak-test="on" in index.html, poiché questo codice attiva le impostazioni di test in produzione.