Пример реализации

Ad Placement API предназначен для поддержки разработчиков AdSense и AdMob, использующих межстраничные объявления и объявления с вознаграждением в играх HTML5 в Интернете или в приложениях. В этом примере показано, как интегрировать API размещения рекламы в игру и использовать его для размещения межстраничной рекламы.

Предпосылки

Прежде чем начать, вам понадобится следующее:

  • Создайте два пустых файла в одном каталоге:
    • index.html
    • игра.js
  • Установите Python локально или используйте веб-сервер для тестирования своей реализации.

Пример кода приложения

Издатели AdMob могут загрузить образец кода приложения, чтобы лучше понять, как API можно интегрировать в игру приложения.

Скачать пример кода приложения

1. Запустите сервер разработки

Поскольку Ads Placement API загружает зависимости по тому же протоколу, что и страница, на которой он загружен, для тестирования приложения необходимо использовать веб-сервер. Вы можете использовать встроенный сервер Python для создания локальной среды разработки.

  1. Откройте терминал.

  2. Перейдите в каталог, содержащий файл index.html, затем запустите:

    python -m http.server 8000
    
  3. В веб-браузере перейдите на localhost:8000

Вы также можете использовать любой другой веб-сервер, например Apache HTTP Server .

2. Создайте игру HTML5

Измените index.html , чтобы создать элемент холста HTML5 и кнопку для запуска игрового процесса. Затем добавьте необходимый тег скрипта для загрузки файла 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>
    <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>

Измените game.js, чтобы играть в игру с подбрасыванием монеты при нажатии кнопки «Играть».

игра.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();

После выполнения этого шага, когда вы откроете index.html в своем браузере (через сервер разработки), вы сможете увидеть игровой холст и кнопку «Играть». Если вы нажмете «Играть», должна начаться игра с подбрасыванием монеты.

3. Импорт API размещения рекламы

Затем добавьте в игру Ad Placement API, вставив тег script в index.html перед тегом game.js

Тег script может принимать ряд параметров . Мы будем использовать следующие параметры, чтобы указать код свойства AdSense и включить тестовый режим:

  • data-ad-client= <AdSense property code> Ваш код свойства AdSense. Это всегда требуется, даже для игр, которые будут работать в приложениях.
  • data-adbreak-test="on" Включает режим тестирования . Удалите это для игр после того, как они будут доставлены игрокам.

Настройте код AdSense и включите тестовый режим.

Функциональность Ad Placement API включена в код AdSense. Чтобы включить его, вы должны сначала добавить код AdSense и включить небольшой фрагмент скрипта, который инициализирует две его ключевые функции: adBreak() и adConfig() .

index.html (Интернет)

 [...]
    <canvas id="gameContainer" height="300px" width="300px"></canvas>
    <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>

Встраивание вашей игры (необязательно)

Если вы хотите встроить игру в другие страницы внутри iFrame, а тег adsbygoogle находится на HTML-странице игры, обязательно добавьте allow='autoplay' в элемент iframe. Это рекомендуемая практика, необходимая для того, чтобы определенные объявления могли показываться в вашей игре.

<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>

Поддержка мобильных приложений

Игра H5 может работать в обычном веб-браузере или в пользовательской вкладке WebView или Chrome в приложении. Ad Placement API может определять, в какой среде работает ваша игра, и соответствующим образом направлять рекламные запросы. Если ваша игра запущена в обычном веб-браузере, запросы объявлений обрабатываются как обычные запросы AdSense. Если Ad Placement API обнаруживает внутреннюю среду приложения, он связывается с GMA SDK, если он присутствует, для запроса и показа рекламы AdMob.

В настоящее время эта возможность поддерживается в приложениях Android, связанных с AdMob GMA SDK. Чтобы включить его, вам нужно зарегистрировать WebView, который будет показывать вашу игру, с помощью GMA SDK, а затем настроить рекламные блоки AdMob и передать их в качестве дополнительных параметров тегу AdSense. Когда ваша игра запускается в подходящем приложении, Ad Placement API будет использовать эти рекламные блоки для показа рекламы.

Чтобы включить поддержку мобильных устройств, необходимо указать следующие дополнительные параметры тега:

  • data-admob-interstitial-slot= <AdMob slot ID> межстраничного рекламного блока AdMob, который вы настроили ранее.
  • data-admob-rewarded-slot= <AdMob slot ID> рекламного блока AdMob с вознаграждением.

Код вашего свойства AdSense всегда должен передаваться с параметром data-ad-client , и должен быть указан хотя бы один из data-admob-interstitial-slot или data-admob-rewarded-slot . Оба параметра должны быть указаны, если ваша игра использует оба формата.

При желании вы также можете указать параметр тега data-admob-ads-only=on , чтобы указать, что ваша игра должна показывать рекламу только из AdMob, а не в AdSense в тех случаях, когда игра запускается в среде, которая не поддерживает Запросы AdMob (например, среды, не относящиеся к приложениям, или приложения без настроенного AdMob GMA SDK).

Важно . Когда вы разрабатываете игру для встраивания в приложение, и вы являетесь владельцем приложения или заключаете соглашение о распределении доходов с владельцем приложения, единственный способ сделать это высокоэффективным и соответствующим политике способом — это чтобы использовать эту поддержку AdMob.

Сначала зарегистрируйте WebView, который будет отображать вашу игру, с помощью GMA SDK:

MainActivity.java (приложение)

...
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    webView = findViewById(R.id.webview_minigame);

    WebSettings settings = webView.getSettings();
    settings.setJavaScriptEnabled(true);

    h5AdsWebViewClient = new H5AdsWebViewClient(this, webView);
    webView.setWebViewClient(h5AdsWebViewClient);

    h5AdsWebViewClient.setDelegateWebViewClient(pubWebViewClient);

Затем передайте рекламные блоки AdMob (один для межстраничных объявлений и один для рекламы с вознаграждением) следующим образом:

index.html (приложение)

 [...]
    <canvas id="gameContainer" height="300px" width="300px"></canvas>
    <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. Вызовите adConfig()

adConfig() передает текущую конфигурацию игры в API размещения рекламы. Затем API может использовать эту информацию для фильтрации запрашиваемых типов объявлений, чтобы они подходили для игры (например, видеообъявления, требующие звука, если звук включен).

Вызов adConfig() должен выполняться каждый раз при изменении этой конфигурации, например, когда пользователь отключает или включает звук в игре. Сделайте вызов adConfig() в конструкторе игры, затем добавьте кнопку для отключения и включения звука в игре, которая выполняет дополнительный adConfig() .

игра.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();
  [...]

Теперь добавьте кнопку отключения звука в свой HTML-файл.

index.html

[...]
    <canvas id="gameContainer" height="300px" width="300px"></canvas>
    <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. Сделайте вызов adBreak() , когда игра закончится.

adBreak() определяет место размещения рекламы и принимает объект, называемый конфигурацией размещения, который определяет все, что требуется для показа рекламы на данном этапе вашей игры. Для поддержки различных типов объявлений вам потребуется инициализировать различные подмножества конфигурации места размещения.

adBreak() определяет место, где может быть показано объявление, или, другими словами, возможность показать объявление. Показ объявления на самом деле зависит от ряда факторов:

  • Заявленный тип рекламного места.
  • Были ли подходящие взаимодействия с пользователем до размещения этого объявления.
  • Существует ли подходящая реклама для текущего игрока, которая:
    • Имеет отношение к ним.
    • Соответствует их настройкам конфиденциальности данных и согласия.
  • Количество объявлений, которые пользователь недавно видел.
  • Параметры управления, которые вы настроили для этой игры, следующие:
    • Подсказки в теге.
    • В AdSense (Примечание: элементы управления, доступные в AdSense, со временем будут меняться)

Добавьте код для межстраничной рекламы, которая будет отображаться при перезапуске игры: сделайте вызов adBreak() внутри функции play() , которая запускается только после того, как игра будет пройдена один раз.

adBreak() должен вызываться как часть действия пользователя, например нажатия кнопки «Воспроизвести», иначе API не сможет запрашивать и отображать рекламу.

Создайте функции, которые будут вызываться до и после рекламной паузы, которые вы затем будете использовать в конфигурации размещения adBreak() . Важно отметить, что функции beforeAd и afterAd будут вызываться только в том случае, если будет найдено подходящее объявление.

игра.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();

Приложение Coin Flip теперь создает рекламные места для показа рекламы.

В вашем собственном приложении могут быть дополнительные подходящие места для рекламы, кроме окончания игры. Вызов adBreak() в этих местах должен быть аналогичен этому примеру.

Отключить тестирование рабочих приложений

Перед выпуском приложения важно удалить или закомментировать строку data-adbreak-test="on" в index.html , так как этот код включает параметры тестирования в рабочей среде.