Örnek uygulama

Ad Placement API, web'deki veya uygulamalardaki HTML5 oyunlarında geçiş reklamları ve ödüllü reklamlar kullanan AdSense ve AdMob geliştiricilerini desteklemek için tasarlanmıştır. Bu örnekte, Ad Placement API'nin bir oyuna nasıl entegre edileceği ve geçiş reklamı yerleştirmek için nasıl kullanılacağı gösterilmektedir.

Ön koşullar

Başlamadan önce aşağıdakilere ihtiyacınız olacaktır:

  • Aynı dizinde iki boş dosya oluşturun:
    • index.html
    • oyun.js
  • Python'u yerel olarak yükleyin veya uygulamanızı test etmek için bir web sunucusu kullanın

Uygulama örnek kodu

AdMob yayıncıları, API'nin uygulama oyunlarına nasıl entegre edilebileceğini daha iyi anlamak için örnek uygulama kodu indirebilir.

Uygulama örnek kodunu indirme

1. Geliştirme sunucusu başlatma

Ads Yerleşim API'sı, bağımlılıkları yüklendiği sayfayla aynı protokol aracılığıyla yüklediğinden, uygulamanızı test etmek için bir web sunucusu kullanmanız gerekir. Yerel bir geliştirme ortamı oluşturmak için Python'un yerleşik sunucusunu kullanabilirsiniz.

  1. Terminali açın.

  2. index.html dosyanızı içeren dizine gidip şunu çalıştırın:

    python -m http.server 8000
    
  3. Bir web tarayıcısında localhost:8000 adresine gidin

Apache HTTP Server gibi başka bir web sunucusu da kullanabilirsiniz.

2. HTML5 oyunu oluştur

HTML5 tuval öğesi ve oyunu tetiklemeyi sağlayan bir düğme oluşturmak için index.html özelliğini değiştirin. Ardından game.js dosyasını yüklemek için gerekli komut dosyası etiketini ekleyin.

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>

"Oynat" düğmesi tıklandığında game-js'yi madeni para çevirme oyunu oynamak için değiştirin.

oyun.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();

Bu adımı tamamladıktan sonra tarayıcınızda (geliştirme sunucunuz aracılığıyla) index.html uygulamasını açtığınızda, oyun tuvalini ve &"Oyun" düğmesini görebilmeniz gerekir. Oynat'ı tıklarsanız jeton çevirme oyunu başlar.

3. Reklam Yerleşimi API'sini içe aktarın

Daha sonra, game.js etiketinden önce index.html bölümüne bir komut dosyası etiketi ekleyerek Ad Placement API'yi oyununuza ekleyin.

Komut dosyası etiketi birkaç parametre alabilir. AdSense mülk kodunu belirtmek ve test modunu etkinleştirmek için aşağıdaki parametreleri kullanacağız:

  • data-ad-client=<AdSense property code> AdSense mülk kodunuz. Bu, uygulamalarda çalışacak oyunlar için bile gereklidir.
  • data-adbreak-test="on" Test modunu etkinleştirir. Oyunculara sunulan oyunlar için bunu kaldırın.

AdSense Kodunu ayarlayın ve test modunu etkinleştirin

Ad Placement API işlevi AdSense koduna eklenir. Bu özelliği etkinleştirmek için önce AdSense kodunu eklemeniz ve iki temel işlevini başlatan küçük bir komut dosyası snippet'i eklemeniz gerekir: adBreak() ve adConfig().

index.html (web)

 [...]
    <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>

Oyununuzu yerleştirme (isteğe bağlı)

Bir oyunu iFrame içindeki diğer sayfalara yerleştirmek istiyorsanız ve adsbygoogle etiketi oyunun HTML sayfasındaysa allow='autoplay' öğesine iframe öğesi eklediğinizden emin olun. Bu en iyi uygulamalardan biridir ve bazı reklamların oyununuza uygun olması için gereklidir.

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

Mobil uygulamaları destekleme

H5 oyunları normal web tarayıcılarında veya uygulama içindeki Web Görünümü ya da Chrome Özel Sekmesinde çalışabilir. Ad Placement API, oyununuzun hangi ortamda çalıştığını algılayıp reklam isteklerini uygun şekilde yönlendirebilir. Oyununuz normal bir web tarayıcısı içinde çalışıyorsa reklam istekleri normal AdSense istekleri olarak değerlendirilir. Ad Placement API bir uygulama içi ortam algılarsa AdMob reklamları istemek ve göstermek için GMA SDK'sı (varsa) ile iletişim kurar.

Bu özellik şu anda, AdMob GMA SDK'sı ile bağlantılı olan Android uygulamalarında desteklenmektedir. Etkinleştirmek için oyununuzu GMA SDK'sıyla gösterecek Web Görünümü'nü kaydetmeniz, ardından AdMob reklam birimlerini yapılandırıp bunları AdSense etiketine ek parametreler olarak iletmeniz gerekir. Oyununuz uygun bir uygulama içinde yayınlandığında Ad Placement API, reklam göstermek için bu reklam birimlerini kullanır.

Mobil desteği etkinleştirmek için aşağıdaki ek etiket parametrelerini belirtmeniz gerekir:

  • data-admob-interstitial-slot=<AdMob slot ID> Daha önce yapılandırdığınız bir AdMob geçiş reklamı birim kimliği.
  • data-admob-rewarded-slot=<AdMob slot ID> AdMob ödüllü reklam birimi kimliği.

AdSense mülk kodunuz her zaman data-ad-client parametresiyle iletilmelidir. En az bir data-admob-interstitial-slot veya data-admob-rewarded-slot belirtilmelidir. Oyununuzda her iki biçim de kullanılıyorsa her iki parametre de belirtilmelidir.

İsteğe bağlı olarak, oyunun AdMob isteklerini desteklemeyen bir ortamda (ör. AdMob GMA SDK'sı yapılandırılmamış uygulama dışı ortamlar veya uygulamalar) oynandığı durumlarda, oyununuzun yalnızca AdMob'dan reklam göstermesi ve AdSense'e yedek getirmemesi gerektiğini belirtmek için data-admob-ads-only=on etiket parametresini de belirtebilirsiniz.

Önemli: Oyununuzu bir uygulamaya yerleştirilecek şekilde tasarlarken, uygulamanın sahibi sizseniz veya uygulamanın sahibiyle gelir paylaşımı sözleşmesi imzalıyorsanız bunu yüksek performans gösteren ve politikaya uygun bir şekilde gerçekleştirmenin tek yolu bu AdMob desteğini kullanmaktır.

Öncelikle, oyununuzu GMA SDK'sıyla gösterecek Web Görünümü'nü kaydedin:

MainActivity.java (uygulama)

...
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);

Ardından, AdMob reklam birimlerini (biri geçiş reklamları, diğeri ödüllü reklamlar için) aşağıdaki gibi iletin:

index.html (uygulama)

 [...]
    <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() çağrısı yapın

adConfig() çağrısı, oyunun mevcut yapılandırmasını Ad Placement API'ye iletir. API, daha sonra bu bilgileri kullanarak istediği reklam türlerini oyuna uygun olacak şekilde filtreleyebilir (ses özelliği etkinse ses gerektiren video reklamlar gibi).

Bu yapılandırma değişikliği olduğunda (örneğin, kullanıcının sesi kapatması veya sesinin açılması) adConfig() numarasına çağrı yapılmalıdır. Oyunun üreticisinde adConfig() adlı kişiyi aradıktan sonra başka bir adConfig() çağrısı yapan oyunun sesini kapatıp açmak için bir düğme ekleyin.

oyun.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();
  [...]

Şimdi sesi kapatma düğmesini HTML dosyanıza ekleyin.

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. Oyun sona erdiğinde adBreak() numaralı telefonu arayın

adBreak() çağrısı bir reklam yerleşimini tanımlar ve oyununuzda bu noktada bir reklamı göstermek için gereken her şeyi belirten yerleşim yapılandırması adlı nesneyi alır. Farklı reklam türlerini desteklemek, farklı bir yerleşim yapılandırması alt kümesi başlatmanızı gerektirir.

adBreak() çağrısı, bir reklamın gösterilebileceği yerleşimi, bir başka deyişle reklam gösterme fırsatını tanımlar. Bir reklamın gerçekten gösterilip gösterilmeyeceği, birkaç unsura bağlıdır:

  • Belirttiğiniz reklam yerleşiminin türü.
  • Bu reklam yerleşiminden önce uygun kullanıcı etkileşimleri olup olmadığı.
  • Mevcut oynatıcı için uygun bir reklam olup olmaması durumunda:
    • Alaka düzeyi yüksek.
    • Bu kullanıcıların veri gizliliği ve izin ayarları tutarlıdır.
  • Kullanıcının yakın zamanda gördüğü reklam sayısı.
  • Bu oyun için yapılandırdığınız kontrol ayarları:
    • Etiketteki ipuçları.
    • AdSense'te (Not: AdSense'teki kontroller zamanla değişecektir)

Oyun yeniden başlatıldığında gösterilecek bir geçiş reklamı için kod ekleyin: play() işlevi içinde, yalnızca oyun bir kez oynandıktan sonra çalıştırılan adBreak() işlevine çağrı yapın.

adBreak(), "Oynat" düğmesini tıklama gibi bir kullanıcı işlemi kapsamında çağrılmalıdır. Aksi takdirde API, reklam isteğinde bulunamaz ve reklam görüntüleyemez.

Reklam arasından önce ve sonra çağrılacak işlevler oluşturun. Bunları daha sonra adBreak() yerleşim yapılandırmasında kullanacaksınız. beforeAd ve afterAd işlevlerinin yalnızca uygun bir reklam bulunması durumunda çağrılacağını unutmamak önemlidir.

oyun.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();

Yazı tura uygulaması artık reklamların gösterilmesi için reklam yerleşimleri oluşturuyor.

Kendi uygulamanızda, oyun sona erdiğinde reklamlar için uygun olmayan başka yerler de olabilir. Bu yerlerden adBreak() arandığında örnektekine benzer olacaktır.

Üretim uygulamaları için testi kapat

Bu kod üretim sırasında test ayarlarını etkinleştirdiği için, uygulamanızı yayınlamadan önce index.html içindeki data-adbreak-test="on" satırını kaldırmanız veya açıklamanız önemlidir.