Ücretsiz APK oluştur

JavaScript köprü API'si

Reklamlar

Bir geçiş veya ödüllü reklamı kendi işaretinizle göstermek ve bir gezinme başladığında ve bittiğinde kabuğa haber vererek birini kesmemesini sağlamak.

AppMintAds.appOpen yardımcı#

window.AppMintAds.appOpen.setEnabled(on)

Örnek

Başlangıçta ve kullanıcı başka bir uygulamadan döndüğünde gösterilen tam ekran reklam olan uygulama açılış reklamını duraklatır veya devam ettirir.

Döndürür: hiçbir şey. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen ve bir uygulama açılış reklamı birim kimliği.

Kullanıcı uygulamadan kısa süreliğine bilerek çıktığında (bir ödeme uygulaması, kamera, bir paylaşım sayfası) bunu duraklatın; böylece geri dönüşte reklam gösterilmez:

var ads = window.AppMintAds;

async function payWithUpi(link) {
  if (ads) ads.appOpen.setEnabled(false);
  try {
    await openPaymentApp(link);           // your own code; the user switches apps and returns
  } finally {
    if (ads) ads.appOpen.setEnabled(true);
  }
}

Derlemede hiç uygulama açılış birimi olup olmadığını kontrol edin:

var hasAppOpen = !!(window.AppMintAds && window.AppMintAds.config().formats.app_open);

Kullanıcı fotoğraf seçerken duraklatın; çünkü sistem fotoğraf seçicisi onları bir an için uygulamadan çıkarır:

var ads = window.AppMintAds;
var input = document.getElementById('photo-input');   // <input type="file" accept="image/*" hidden>
var pausedForPicker = false;

document.getElementById('pick-photo').addEventListener('click', function () {
  if (ads) { ads.appOpen.setEnabled(false); pausedForPicker = true; }
  input.click();
});

input.addEventListener('change', function () {
  if (input.files[0]) uploadPhoto(input.files[0]);      // your own code
});

// Back in the app (a photo was picked or the picker was cancelled): turn it on again.
document.addEventListener('visibilitychange', function () {
  if (document.hidden || !pausedForPicker) return;
  pausedForPicker = false;
  setTimeout(function () { ads.appOpen.setEnabled(true); }, 1000);
});

Notlar: Varsayılan olarak açıktır. Soğuk başlangıçta reklam, sayfa hazır olduğunda veya 15 saniye içinde yüklemeyi bitirdiğinde gösterilir; sonraki bir yükleme bir sonraki sefer için saklanır. 4 saatten eski bir uygulama açılış reklamı asla gösterilmez. Ayrıca kendiniz de gösterebilirsiniz AppMintAds.show('app_open').

AppMintAds.banner yardımcı#

window.AppMintAds.banner.attach(target, opts) / .detach(slotOrElement)

Örnek

Sayfanızda seçtiğiniz bir öğenin üzerine herhangi bir yere banner veya 300×250 orta dikdörtgen reklam yerleştirir.

Döndürür: attach, reklam yüklendikten sonra {ok:true, slot, width, height} (CSS px) değerinin Promise'ini veya {ok:false, slot?, code, message?} döndürür. detach hiçbir şey döndürmez. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen ve bir banner (veya orta dikdörtgen) reklam birimi kimliği.

Öğe yalnızca yer ayırır. Reklam onun üzerine çizilir ve sayfa kaydırıldığında veya yeniden boyutlandığında onu takip eder:

<div id="ad-slot"></div>

<script>
var ads = window.AppMintAds;
var slotEl = document.getElementById('ad-slot');

if (ads) {
  ads.banner.attach(slotEl, { size: 'banner' }).then(function (res) {
    // On success the helper sets slotEl.style.minHeight to res.height (pass keepHeight:true to stop that).
    if (!res.ok) {                         // no_fill, network, too_many_slots, ...
      if (res.slot) ads.banner.detach(res.slot);   // a failed slot still counts toward the limit of two
      slotEl.hidden = true;
    }
  });
} else {
  slotEl.hidden = true;                    // browser: no ads here
}
</script>

Orta dikdörtgen (aynı anda bir tane) ve bir banner'ı yeniden kaldırma:

var box = document.querySelector('.article-end-ad');
var mrecSlot = null;

if (window.AppMintAds) {
  window.AppMintAds.banner.attach(box, { size: 'medium_rectangle' }).then(function (res) {
    if (res.ok) mrecSlot = res.slot;
    else { if (res.slot) window.AppMintAds.banner.detach(res.slot); box.hidden = true; }
  });
}

function leaveArticle() {
  if (window.AppMintAds && mrecSlot) window.AppMintAds.banner.detach(mrecSlot);   // or detach(box)
  mrecSlot = null;
}

Reklam bulunamadığında bir alanı daha sonra tekrar deneyin; başarısız alanı önce serbest bırakın ki ikisinden birini tüketmesin:

function fillSlot(el, triesLeft) {
  var ads = window.AppMintAds;
  if (!ads) { el.hidden = true; return; }             // browser: no ads here
  ads.banner.attach(el, { size: 'banner' }).then(function (res) {
    if (res.ok) return;
    if (res.slot) ads.banner.detach(res.slot);
    if ((res.code === 'no_fill' || res.code === 'network') && triesLeft > 0) {
      setTimeout(function () { fillSlot(el, triesLeft - 1); }, 60000);
    } else {
      el.hidden = true;                                 // ad_free, disabled, consent, ...
    }
  });
}

fillSlot(document.getElementById('footer-ad'), 2);

Notlar: target bir öğe veya CSS seçicisidir; size 'banner' (varsayılan, uyarlanabilir genişlik, en fazla 90 dp yüksekliğinde), 'medium_rectangle' veya 'mrec'. Aynı anda en fazla iki alan vardır ve reklamı yüklenemeyen bir alan siz ayırana kadar yine sayılır. detach, seçici değil, öğeyi veya attach işlevinden gelen alan kimliğini gerektirir. Öğeyi DOM'dan kaldırmak da onu ayırır. Kodlar: no_element, duplicate_slot, too_many_slots, detached, no_fill, network, invalid_unit, ad_free, disabled, consent, automatic_mode, internal.

AppMintAds.config yardımcı#

window.AppMintAds.config()

Örnek

Sayfaya derlemenin hangi reklam kontrol modunu kullandığını ve hangi reklam biçimlerini sunabildiğini bildirir.

Döndürür: eşzamanlı olarak bir nesne: {control: 'automatic' | 'developer', formats: {banner, mrec, interstitial, rewarded, rewarded_interstitial, app_open}} (her biçim true / false). Dahili bir hatada {control:'automatic', formats:{}} döndürür. Gerekenler: hiçbir şey; window.AppMintAds yalnızca yüklü uygulamanın içinde bulunur.

Yalnızca bu derlemenin gerçekten sunabildiği reklam arayüzünü gösterin:

var ads = window.AppMintAds;               // undefined in a browser
var cfg = ads ? ads.config() : null;

var developer = !!(cfg && cfg.control === 'developer');
document.getElementById('watch-ad').hidden = !(developer && cfg.formats.rewarded);
document.getElementById('ad-slot').hidden  = !(developer && cfg.formats.banner);

Bir "bonus" düğmesi için derlemede bulunan ödüllü biçimi seçin ve hiçbiri yoksa düğmeyi gizleyin:

var ads = window.AppMintAds;
var cfg = ads ? ads.config() : null;
var bonusBtn = document.getElementById('bonus');

var bonusType = null;
if (cfg && cfg.control === 'developer') {
  if (cfg.formats.rewarded) bonusType = 'rewarded';
  else if (cfg.formats.rewarded_interstitial) bonusType = 'rewarded_interstitial';
}
bonusBtn.hidden = !bonusType;

bonusBtn.addEventListener('click', async function () {
  var res = await ads.show(bonusType);                  // inside the tap: plays at once
  if (res.earned) addCoins(res.reward.amount);
});

Bir makalenin sonu için reklam boyutunu seçin: derlemede varsa orta dikdörtgen, yoksa banner:

var ads = window.AppMintAds;
var cfg = ads ? ads.config() : null;
var box = document.getElementById('article-end-ad');

var size = null;
if (cfg && cfg.control === 'developer') {
  size = cfg.formats.mrec ? 'medium_rectangle' : (cfg.formats.banner ? 'banner' : null);
}

if (!size) box.hidden = true;
else ads.banner.attach(box, { size: size }).then(function (res) {
  if (!res.ok) { if (res.slot) ads.banner.detach(res.slot); box.hidden = true; }
});

Notlar: Reklamlar açıksa ve derlemenin o biçim için bir reklam birimi kimliği varsa biçim true olur. Otomatik modda (control: 'automatic') her load / show / banner.attach çağrısı code: 'automatic_mode' döndürür; orada WebToApk.showRewardedAd() / showInterstitialAd() kullanın. Reklamları sayfadan yönetmek için derleme sihirbazında Reklam Kontrolü → Geliştirici tarafından kontrol edilen seçeneğini seçin.

AppMintAds.isReady yardımcı#

window.AppMintAds.isReady(type)

Örnek

Bu türde tam ekran bir reklamın yüklenip yüklenmediğini ve şu anda gösterilip gösterilemeyeceğini söyler.

Döndürür: true / false, eşzamanlı. type: 'interstitial', 'rewarded', 'rewarded_interstitial' veya 'app_open'. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen ve tür için bir reklam birimi kimliği.

appmint:ad durum olayını kullanarak "Reklam izle" düğmesini reklamla uyumlu tutun:

var ads = window.AppMintAds;
var btn = document.getElementById('watch-ad');

function refresh() { btn.disabled = !(ads && ads.isReady('rewarded')); }

if (ads) {
  refresh();
  window.addEventListener('appmint:ad', function (e) {
    if (e.detail.type === 'rewarded') refresh();    // phases: loaded, failed, closed, ...
  });
} else {
  btn.hidden = true;                                // browser: no ads here
}

"Paranı ikiye katla" teklifini yalnızca ödüllü bir reklam zaten beklerken sonuç ekranında sunun:

function showResults(coins) {
  var ads = window.AppMintAds;
  var offer = document.getElementById('double-coins');
  renderResults(coins);                                 // your own screen
  offer.hidden = !(ads && ads.isReady('rewarded'));
  offer.onclick = async function () {
    offer.hidden = true;
    var res = await ads.show('rewarded');               // inside the tap: plays at once
    addCoins(res.earned ? coins : 0);                   // the bonus: the same amount again
  };
}

Bir ipucu düğmesinde, şu anda yüklü olan ödüllü biçimi oynatın:

document.getElementById('hint').addEventListener('click', async function () {
  var ads = window.AppMintAds;
  if (!ads) return;                                     // browser: no ads here
  var type = ads.isReady('rewarded') ? 'rewarded'
           : ads.isReady('rewarded_interstitial') ? 'rewarded_interstitial'
           : null;
  if (!type) { showMessage('No hint video right now. Try again in a minute.'); return; }
  var res = await ads.show(type);
  if (res.earned) revealHint();
});

Notlar: banner ve mrec her zaman false döndürür (gösterilmezler, eklenirler). 60 saniyelik bekleme süresindeki bir geçiş reklamı false döndürür; 4 saatten eski bir uygulama açılış reklamı false döndürür. Otomatik modda bu her zaman false.

AppMintAds.load yardımcı#

window.AppMintAds.load(type)

Örnek

Daha sonraki bir show(type) çağrısının hemen oynatabilmesi için tam ekran bir reklam yükler.

Döndürür: asla reddedilmeyen ve {ok:true}, zaten bir reklam beklerken {ok:true, cached:true} veya {ok:false, code, reason, message?, adCode?} ile sonuçlanan bir Promise. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen ve tür için bir reklam birimi kimliği (interstitial, rewarded, rewarded_interstitial, app_open).

var ads = window.AppMintAds;
var btn = document.getElementById('watch-ad');
btn.disabled = true;

async function prepareRewarded() {
  if (!ads) { btn.hidden = true; return; }          // browser: no ads
  var res = await ads.load('rewarded');
  if (res.ok) { btn.disabled = false; return; }
  if (res.code === 'no_fill' || res.code === 'network') setTimeout(prepareRewarded, 30000);
  else console.log('rewarded ad unavailable:', res.code, res.message);
}
prepareRewarded();

Her isteğin tüm yaşamı ayrıca appmint:ad olayında akar:

window.addEventListener('appmint:ad', function (e) {
  var a = e.detail;   // {type, phase, slot?, code?, adCode?, message?, width?, height?, reward?, earned?}
  // phase: loading, loaded, failed, opened, impression, clicked, closed, rewarded, show_failed, opt_in, declined
  if (a.phase === 'failed') console.log(a.type, 'failed to load:', a.code, a.adCode, a.message);
});
// The same object also goes to window.onAppMintAd, if you define that function.
window.onAppMintAd = function (a) { console.log('ad', a.type, a.phase); };

Geçiş reklamını bir seviye başladığında yükleyin, böylece seviye bittiğinde hazır olsun ve kullanıcı reklamları kaldırınca sormayı bırakın:

var ads = window.AppMintAds;
var interstitialsOff = false;

async function startLevel(n) {
  runLevel(n);                                          // your own game
  if (!ads || interstitialsOff) return;
  var res = await ads.load('interstitial');
  if (!res.ok && (res.code === 'ad_free' || res.code === 'disabled' || res.code === 'automatic_mode')) {
    interstitialsOff = true;                            // no interstitials in this app session
  }
}

async function levelEnded() {
  if (ads && !interstitialsOff && ads.isReady('interstitial')) await ads.show('interstitial');
  showLevelSummary();
}

Notlar: Kodlar: no_fill, network, invalid_unit, internal (AdMob'dan), automatic_mode, unknown_type, ad_free, disabled, consent ve banner / mrec için use_slot (şunu kullanın: AppMintAds.banner.attach). Uygulama, birim kimliği olan her tam ekran türünü zaten önceden yükler ve her gösterimden sonra bir sonrakini yükler; bu yüzden load çoğunlukla düğmenin ne zaman etkinleştirilebileceğini bilmek içindir.

AppMintAds.show yardımcı#

window.AppMintAds.show(type)

Örnek

Yüklenmiş bir tam ekran reklamı gösterir: interstitial, rewarded, rewarded_interstitial veya app_open.

Döndürür: reklam kapandığında sonuçlanan (asla reddedilmeyen) bir Promise: {ok:true, shown:true, earned, reward?} (reward = ödüllü biçimler için {type, amount}) veya hiçbir şey gösterilmediyse {ok:false, shown:false, code, reason, message?}. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen ve tür için bir reklam birimi kimliği.

Ödüllü: kullanıcının kendi dokunuşunun içinde çağırın. Bu dokunuş kullanıcının onayıdır, bu yüzden reklam hemen oynar. Yalnızca earned true olduğunda ödül verin:

var ads = window.AppMintAds;

document.getElementById('watch-ad').addEventListener('click', async function () {
  if (!ads) return;                                  // browser: no ads here
  var res = await ads.show('rewarded');
  if (res.earned) addCoins(res.reward.amount);
  else if (res.reason === 'ad_free') addCoins(50);   // user paid to remove ads: reward anyway
  else if (res.shown) showMessage('Watch to the end to get the reward.');
  else if (res.reason !== 'declined') showMessage('No ad available right now.');
});

Geçiş reklamı: doğal bir aradan. Cevap ne olursa olsun devam edin:

async function levelFinished() {
  if (window.AppMintAds && window.AppMintAds.isReady('interstitial')) {
    await window.AppMintAds.show('interstitial');    // resolves when the ad closes
  }
  showNextLevel();
}

Net bir "Hayır, teşekkürler" içeren kendi tanıtım ekranınızın arkasında ödüllü geçiş reklamı. "İzle" dokunuşu kullanıcının onayıdır:

var ads = window.AppMintAds;
var intro = document.getElementById('free-life-intro');   // your own dialog: Watch / No thanks

function offerFreeLife() {
  if (ads && ads.isReady('rewarded_interstitial')) intro.hidden = false;
  else gameOver();
}

document.getElementById('free-life-watch').addEventListener('click', async function () {
  intro.hidden = true;
  var res = await ads.show('rewarded_interstitial');
  if (res.earned) continueWithExtraLife();
  else gameOver();
});

document.getElementById('free-life-skip').addEventListener('click', function () {
  intro.hidden = true;
  gameOver();
});

Notlar: Kullanıcı dokunuşundan GELMEYEN (zamanlayıcı, sayfa yüklemesi, rota değişimi) ödüllü veya ödüllü geçiş reklamı show() çağrısı önce "Reklam izlensin mi? / Hayır, teşekkürler" ekranı alır ve "Hayır, teşekkürler" declined döndürür. Ödüllü biçimleri asla bu şekilde tetiklemeyin. Diğer kodlar: automatic_mode, unknown_type, ad_free, disabled, consent, not_full_screen, showing, cooldown (geçiş reklamları arasında 60 sn), not_loaded (bir sonraki sefer için yeni yükleme başlar), show_failed, internal. Otomatik modda şunu kullanın WebToApk.showRewardedAd().

adsAppOpenEnable köprü#

window.WebToApk.adsAppOpenEnable(enabled: Boolean)

Sayfanın, başka bir uygulamadan dönüşte uygulama açılış reklamını duraklatıp devam ettirmesini sağlar (bir birim ayarlıysa varsayılan olarak açıktır).

Örnek

AppMintAds.appOpen.setEnabled(on) için yerel yarı: uygulama açılış reklamını duraklatır veya devam ettirir. Sayfalar şunu kullanır AppMintAds.appOpen.setEnabled.

Döndürür: hiçbir şey. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen ve bir uygulama açılış reklamı birim kimliği.

function setAppOpenAds(on) {
  if (window.AppMintAds) window.AppMintAds.appOpen.setEnabled(on);
}

// Pause while the user is in the middle of something, resume afterwards.
function startCheckout() { setAppOpenAds(false); showCheckout(); }
function checkoutDone()  { setAppOpenAds(true); }

Fotoğraf seçmek uygulamadan sistem seçicisine çıkar ve geri dönüş bir dönüş olarak sayılır. Uygulama açılış reklamını bunun etrafında duraklatın:

var input = document.getElementById('photo');

function appOpenAds(on) {
  if (window.AppMintAds) window.AppMintAds.appOpen.setEnabled(on);
}

input.addEventListener('click', function () { appOpenAds(false); });
function pickerDone() { setTimeout(function () { appOpenAds(true); }, 1000); }
input.addEventListener('change', pickerDone);
input.addEventListener('cancel', pickerDone);

Kendi ücretli planınızın üyeleri bunu asla görmez. Anahtar kaydedilmez, bu yüzden her açılışta erken ayarlayın:

// Runs from a <head> script: window.AppMintAds is already there at document start.
var plan = null;
try { plan = localStorage.getItem('plan'); } catch (e) {}

if (window.AppMintAds && plan === 'pro') {
  window.AppMintAds.appOpen.setEnabled(false);
}

Notlar: Ham imza adsAppOpenEnable(enabled). Bir uygulama açılış birimi ayarlıysa varsayılan olarak açıktır. Uygulama açılış reklamı soğuk başlangıçta (15 saniye içinde yüklenirse) ve kullanıcı başka bir uygulamadan döndüğünde gösterilir; 4 saatten eski bir reklam asla gösterilmez.

adsConfig köprü#

window.WebToApk.adsConfig(): String

`{control, formats:{banner, mrec, interstitial, rewarded, rewarded_interstitial, app_open}}` - bu derlemenin sunabildiği reklam biçimleri.

Örnek

Bu derlemenin hangi reklam biçimlerini sunabildiğini ve hangi reklam kontrol modunu kullandığını okur. Sayfalar normalde bunu sizin için ayrıştıran AppMintAds.config() çağrısını yapar.

Döndürür: bir JSON dizesi: {"control":"automatic"|"developer","formats":{"banner":bool,"mrec":bool,"interstitial":bool,"rewarded":bool,"rewarded_interstitial":bool,"app_open":bool}}. Reklamlar açıksa ve derlemenin o biçim için bir reklam birimi kimliği varsa biçim true olur. Gerekenler: hiçbir şey.

Önce genel API:

if (window.AppMintAds) {
  var cfg = window.AppMintAds.config();      // already parsed; {control:'automatic', formats:{}} on error
  if (cfg.control === 'developer' && cfg.formats.rewarded) {
    document.getElementById('watch-ad').hidden = false;
  }
}

Şunu kullanmıyorsanız ham çağrı AppMintAds:

var b = window.WebToApk;
if (b && typeof b.adsConfig === 'function') {
  try {
    var cfg = JSON.parse(b.adsConfig());
    console.log(cfg.control, cfg.formats);
  } catch (e) { console.log('could not read ad config', e); }
}

Yalnızca bu derlemenin gerçekten sahip olduğu biçimler için yer ayırın, aksi halde boş kutuyu sayfaya geri verin:

var box = document.getElementById('sidebar-ad');
var cfg = window.AppMintAds ? window.AppMintAds.config() : { control: 'automatic', formats: {} };

if (cfg.control === 'developer' && cfg.formats.mrec) {
  window.AppMintAds.banner.attach(box, { size: 'mrec' });
} else if (cfg.control === 'developer' && cfg.formats.banner) {
  window.AppMintAds.banner.attach(box, { size: 'banner' });
} else {
  box.remove();                                   // browser, Automatic mode, or no unit: no empty gap
}

Notlar: Otomatik modda formats hangi birimlerin var olduğunu yine söyler, ancak AppMintAds.load/show code: 'automatic_mode' döndürür; orada WebToApk.showRewardedAd() / showInterstitialAd() kullanın.

adsIsReady köprü#

window.WebToApk.adsIsReady(type: String): Boolean

Tam ekran bir [type] yüklenmiş ve şu anda gösterilebiliyorsa true.

Örnek

Bir türdeki tam ekran reklamın yüklenip yüklenmediğini ve şimdi gösterilip gösterilemeyeceğini söyler (Geliştirici tarafından kontrol edilen reklamlar). Sayfalar normalde şunu çağırır AppMintAds.isReady(type).

Döndürür: true / false, eşzamanlı. type 'interstitial', 'rewarded', 'rewarded_interstitial' veya 'app_open'; 'banner' / 'mrec' her zaman false döndürür. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen ve o tür için bir reklam birimi kimliği.

Önce genel API:

var watchBtn = document.getElementById('watch-ad');
function refresh() {
  watchBtn.disabled = !(window.AppMintAds && window.AppMintAds.isReady('rewarded'));
}
refresh();
window.addEventListener('appmint:ad', refresh);     // loaded / closed / failed all change readiness

Ham çağrı:

var b = window.WebToApk;
var ready = !!(b && typeof b.adsIsReady === 'function' && b.adsIsReady('interstitial'));

Bir seviyenin sonunda geçiş reklamını yalnızca biri beklerken gösterin ve beklemiyorsa oyuncuyu asla geri tutmayın:

function onLevelComplete() {
  var ads = window.AppMintAds;
  if (ads && ads.isReady('interstitial')) {
    // resolves after the ad closes, or at once with {ok:false, code} if it could not show
    ads.show('interstitial').then(startNextLevel);
  } else {
    startNextLevel();                             // not loaded yet, or inside the 60-second cooldown
  }
}

Notlar: 60 saniyelik bekleme süresi içindeki bir geçiş reklamı false döndürür. 4 saatten eski bir uygulama açılış reklamı false döndürür (Google bunu göstermemenizi söyler). Otomatik modda bu her zaman false; orada WebToApk.isRewardedAdReady() kullanın.

adsLoad köprü#

window.WebToApk.adsLoad(type: String, callbackId: String)

Tam ekran bir [type] yükler; [callbackId] için promise sonuçla çözülür.

Örnek

AppMintAds.load(type) için yerel yarı: tam ekran bir reklamın yüklenmesini başlatır ve shim'in geri çağrısını yanıtlar. Sayfalar Promise döndüren AppMintAds.load(type) kullanır; bunu doğrudan çağırmayın.

Döndürür: (AppMintAds.load aracılığıyla) {ok:true}, zaten bir tane yüklüyken {ok:true, cached:true} veya {ok:false, code, reason, message?, adCode?} değerinin Promise'ini döndürür. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen ve tür için bir reklam birimi kimliği.

var watchBtn = document.getElementById('watch-ad');
watchBtn.disabled = true;

if (window.AppMintAds) {
  window.AppMintAds.load('rewarded').then(function (res) {
    if (res.ok) watchBtn.disabled = false;
    else console.log('rewarded ad not loaded:', res.code, res.message);
  });
} else {
  watchBtn.hidden = true;                       // browser: there are no ads here
}

Geçici bir nedenle başarısız olan yüklemeyi yeniden deneyin ve yeniden denemenin çözemeyeceği nedenlerde durun:

function loadWithRetry(type, attempt) {
  attempt = attempt || 0;
  return window.AppMintAds.load(type).then(function (res) {
    if (res.ok) return res;
    if ((res.code === 'no_fill' || res.code === 'network') && attempt < 3) {
      return new Promise(function (wait) { setTimeout(wait, 5000 * (attempt + 1)); })
        .then(function () { return loadWithRetry(type, attempt + 1); });
    }
    return res;                                   // invalid_unit, consent, ad_free, disabled ...
  });
}

if (window.AppMintAds) {
  loadWithRetry('rewarded').then(function (res) {
    document.getElementById('watch-ad').disabled = !res.ok;
  });
}

Bir oyun oturumu başlamadan önce iki biçimi ısıtın ve kullanıcının hiç reklamı yoksa tüm reklam düğmelerini gizleyin:

if (window.AppMintAds) {
  Promise.all([
    window.AppMintAds.load('interstitial'),
    window.AppMintAds.load('rewarded_interstitial')
  ]).then(function (results) {
    var noAds = results.some(function (r) { return r.code === 'ad_free' || r.code === 'disabled'; });
    if (noAds) hideAllAdButtons();                // paid to remove ads, or ads are off in this build
    results.forEach(function (r) {
      if (!r.ok && r.adCode !== undefined) console.log('ad load failed', r.code, r.adCode, r.message);
    });
  });
}

Notlar: Hata kodları: no_fill, network, invalid_unit, internal (AdMob'dan, adCode ile) ve automatic_mode, unknown_type, ad_free, disabled, consent ve banner / mrec için use_slot (bunlar AppMintAds.banner.attach ile yüklenir). Uygulama, birim kimliği olan her tam ekran türünü zaten önceden yükler ve her gösterimden sonra yeniden yükler. Ham imza adsLoad(type, callbackId); cevabı dahili bir çözümleyiciye gider, bu yüzden doğrudan çağrı size sonuç vermez.

adsShow köprü#

window.WebToApk.adsShow(type: String, callbackId: String, userGesture: Boolean)

Yüklenmiş tam ekran bir [type] gösterir; kapandığında, ödüllü biçimler için earned/reward ile sonuçlanır. [userGesture], shim'in `navigator.userActivation` okumasıdır - bunsuz istenen ödüllü biçim önce AdMob'un tanıtım ekranını alır (bkz. DeveloperAds.offerRewarded).

Örnek

AppMintAds.show(type) için yerel yarı: yüklenmiş tam ekran bir reklamı gösterir ve kapandığında cevap verir. Sayfalar AppMintAds.show(type) kullanır; bunu doğrudan çağırmayın.

Döndürür: (AppMintAds.show aracılığıyla) reklam kapandıktan sonra {ok:true, shown:true, earned, reward?} değerinin Promise'ini (reward = ödüllü biçimler için {type, amount}) veya {ok:false, shown:false, code, reason, message?} döndürür. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen ve tür için bir reklam birimi kimliği.

Kullanıcının dokunuşundan çağırın. Shim, üçüncü argüman olarak navigator.userActivation.isActive değerini geçirir (userGesture):

document.getElementById('watch-ad').addEventListener('click', function () {
  if (!window.AppMintAds) return;
  window.AppMintAds.show('rewarded').then(function (res) {
    if (res.earned) addCoins(res.reward.amount);
    else if (res.reason === 'ad_free') addCoins(50);      // paid to remove ads: reward anyway
    else if (res.reason !== 'declined') showMessage('No ad available right now.');
  });
});

Kullanıcının kendi "Bonusumu ikiye katla" dokunuşundan ödüllü geçiş reklamı sunun ve cevap ne olursa olsun devam edin:

document.getElementById('double-bonus').addEventListener('click', function () {
  if (!window.AppMintAds) return goToNextLevel();
  window.AppMintAds.show('rewarded_interstitial').then(function (res) {
    if (res.earned) doubleLevelBonus();
    else if (!res.shown && res.code !== 'declined') console.log('no ad:', res.code);
    goToNextLevel();                              // shown or not, the player keeps going
  });
});

appmint:ad akışını kullanarak, ekranda herhangi bir tam ekran reklam varken oyun müziğinizi duraklatın:

window.addEventListener('appmint:ad', function (e) {
  var d = e.detail;                               // {type, phase, code?, adCode?, message?, earned?, reward?}
  if (d.type === 'banner' || d.type === 'mrec') return;
  if (d.phase === 'opened') music.pause();
  if (d.phase === 'closed' || d.phase === 'show_failed') music.play();
});

function onChapterSaved() {
  if (window.AppMintAds) window.AppMintAds.show('interstitial');   // a natural break
}

Notlar: Ham imza adsShow(type, callbackId, userGesture). userGesture, rewarded veya rewarded_interstitial için false olduğunda uygulama önce "Reklam izlensin mi? / Hayır, teşekkürler" diye sorar ve "hayır" cevabı declined döndürür. Diğer kodlar: automatic_mode, unknown_type, ad_free, disabled, consent, not_full_screen, showing, cooldown (geçiş reklamı, 60 sn), not_loaded (bir sonraki sefer için yükleme başlar), show_failed, internal.

adsSlotAttach köprü#

window.WebToApk.adsSlotAttach(slotId: String, type: String, widthCss: Int, callbackId: String)

Sayfanın [slotId] alanı için, [widthCss] genişliğinde bir banner/mrec katmanı oluşturur; yüklenince reklamın boyutuyla sonuçlanır.

Örnek

AppMintAds.banner.attach(element, {size}) için yerel yarı: bir sayfa öğesinin üzerinde banner veya orta dikdörtgen reklam oluşturur. Sayfalar AppMintAds.banner.attach kullanır; bunu doğrudan çağırmayın.

Döndürür: (AppMintAds.banner.attach aracılığıyla) reklam yüklendikten sonra CSS piksel cinsinden {ok:true, slot, width, height} değerinin Promise'ini veya {ok:false, slot, code, message?} döndürür. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen ve bir banner (veya orta dikdörtgen) reklam birimi kimliği.

<div id="ad-slot"></div>

<script>
if (window.AppMintAds) {
  window.AppMintAds.banner.attach('#ad-slot', { size: 'banner' }).then(function (res) {
    if (!res.ok) console.log('no banner:', res.code);   // e.g. no_fill, network, too_many_slots
  });
}
</script>

Reklam gelmediğinde yerini geri veren, sonuç ekranında bir orta dikdörtgen:

var box = document.getElementById('result-ad');

if (window.AppMintAds) {
  window.AppMintAds.banner.attach(box, { size: 'mrec' }).then(function (res) {
    if (res.ok) return;                           // the box now has min-height = res.height
    window.AppMintAds.banner.detach(res.slot);    // free the slot for another banner
    box.hidden = true;
    if (res.code === 'too_many_slots') console.log('detach a banner first:', res.message);
  });
} else {
  box.hidden = true;
}

appmint:ad akışından, attach işlevinin döndürdüğü alan kimliğine göre alan başına gösterimleri ve tıklamaları sayın:

var slotNames = {};

if (window.AppMintAds) {
  window.AppMintAds.banner.attach('#footer-ad', { size: 'banner' }).then(function (res) {
    if (res.ok) slotNames[res.slot] = 'footer';
  });
}

window.addEventListener('appmint:ad', function (e) {
  var d = e.detail;                               // banner events carry {type, phase, slot}
  if (d.slot && (d.phase === 'impression' || d.phase === 'clicked')) {
    track('ad_' + d.phase, slotNames[d.slot] || d.slot);
  }
});

Notlar: Ham imza adsSlotAttach(slotId, type, widthCss, callbackId); type 'banner' veya 'mrec'. Bir WebView sayfanın içinde yerel görünüm tutamaz, bu yüzden reklam öğenizin üzerine çizilir ve kaydırma ve yeniden boyutlandırmada onu takip eder (bkz. adsSlotRect). Aynı anda en fazla iki alan ve yalnızca bir orta dikdörtgen. Ek kodlar: duplicate_slot, too_many_slots, detached, internal, ayrıca yükleme kodları (no_fill, network, invalid_unit, ad_free, disabled, consent, automatic_mode).

adsSlotDetach köprü#

window.WebToApk.adsSlotDetach(slotId: String)

Bir banner katmanını kaldırır.

Örnek

AppMintAds.banner.detach(slotOrElement) için yerel yarı: bir banner katmanını kaldırır ve alanını serbest bırakır. Sayfalar şunu kullanır AppMintAds.banner.detach.

Döndürür: hiçbir şey. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen.

Reklamın uygun olmadığı bir ekrandan (video oynatıcı, ödeme) önce banner'ı kaldırın:

var slotEl = document.getElementById('ad-slot');

function openPlayer() {
  if (window.AppMintAds) window.AppMintAds.banner.detach(slotEl);   // the element, or the slot id from attach()
  showPlayer();
}

function closePlayer() {
  hidePlayer();
  if (window.AppMintAds) window.AppMintAds.banner.attach(slotEl, { size: 'banner' });
}

Tek sayfalık bir uygulamada, banner'ı tutan rota kaybolduğunda onu serbest bırakın. attach öğeyi hemen işaretler, bu yüzden reklam hâlâ yüklenirken bile öğeye göre ayırma çalışır:

function onRouteChange(route) {
  if (!window.AppMintAds) return renderRoute(route);
  var old = document.getElementById('article-ad');
  if (old) window.AppMintAds.banner.detach(old);
  renderRoute(route);
  if (route === '/articles') {
    window.AppMintAds.banner.attach('#article-ad', { size: 'banner' });
  }
}

"Reklamları Kaldır" satın alımından sonra katmanlar kaybolur; alanları da ayırın ve ayırdıkları yeri bırakın:

window.addEventListener('appmint:premium', function (e) {
  if (!e.detail.premium || !window.AppMintAds) return;
  document.querySelectorAll('[data-appmint-ad-slot]').forEach(function (el) {
    window.AppMintAds.banner.detach(el);
    el.remove();
  });
});

Notlar: Ham imza adsSlotDetach(slotId). detach, CSS seçici değil, attach işlevinin döndürdüğü öğeyi veya slot dizesini alır. Reklamını hâlâ bekleyen bir attach Promise'i {ok:false, code:'detached'} döndürür. Öğeyi DOM'dan kaldırmak da alanı ayırır.

adsSlotRect köprü#

window.WebToApk.adsSlotRect(slotId: String, x: Float, y: Float, w: Float, h: Float, visible: Boolean)

Dahili: alan öğesinin geçerli görünüm alanı dikdörtgeni (CSS px) - katmanı taşır.

Örnek

Dahili: bir banner katmanını öğesinin geçerli konumuna taşır. AppMintAds.banner yardımcısı bunu kaydırma, yeniden boyutlandırma, görünürlük değişikliği ve her 500 ms'de sizin için çağırır; sayfalar AppMintAds.banner.attach kullanır ve bunu asla çağırmaz.

Döndürür: hiçbir şey. Gerekenler: Reklam Kontrolü → Geliştirici tarafından kontrol edilen ve şunun oluşturduğu bir alan AppMintAds.banner.attach.

Bir sayfanın yaptığı tek şey alan öğesine düzende bir yer vermektir. Yardımcı onu ölçer ve reklamı üzerinde tutar:

<main>
  <article id="story">…</article>
  <div id="ad-slot" style="margin: 16px 0"></div>   <!-- the ad follows this box while scrolling -->
</main>

<script>
if (window.AppMintAds) window.AppMintAds.banner.attach('#ad-slot', { size: 'banner' });
</script>

Sayfada değil, kaydırılan bir listenin içinde bir banner: yardımcı kaydırmayı yakalama aşamasında dinler, bu yüzden reklam iç kapsayıcıyı da takip eder:

<div id="feed" style="height: 100vh; overflow-y: auto">
  <div class="card">…</div>
  <div class="card">…</div>
  <div id="feed-ad" style="margin: 12px 0"></div>
  <div class="card">…</div>
</div>

<script>
if (window.AppMintAds) window.AppMintAds.banner.attach('#feed-ad', { size: 'banner' });
</script>

Reklam sayfanın üzerine çizilir, bu yüzden kendi iletişim kutunuz altında kalır. İletişim kutusu açıkken alanı gizleyin:

var slotEl = document.getElementById('ad-slot');
var dialog = document.getElementById('settings-dialog');

function openSettings() {
  slotEl.style.visibility = 'hidden';             // the helper hides the overlay on its next tick
  dialog.showModal();
}

dialog.addEventListener('close', function () {
  slotEl.style.visibility = '';                   // and puts it back over the box
});

Notlar: Ham imza adsSlotRect(slotId, x, y, w, h, visible), görünüm alanına göre CSS piksel cinsinden. Öğe ekran dışındayken, sıfır boyuttayken, visibility: hidden değerine sahipken veya sayfa arka plandayken katman gizlenir. Öğe DOM'dan çıkarsa yardımcı alanı kendiliğinden ayırır.

isInterstitialAdReady köprü#

window.WebToApk.isInterstitialAdReady(): Boolean

Bir geçiş reklamı yüklenmiş VE bekleme süresini geçmişse true (showInterstitialAd() işlevinin kabul edeceğiyle tam olarak eşleşir - sonra göstermeyi reddeden bir "hazır" yok).

Örnek

Bir geçiş reklamının yüklenmiş VE 60 saniyelik bekleme süresini geçmiş olup olmadığını söyler; böylece showInterstitialAd() onu şimdi gösterir (Otomatik reklam kontrolü).

Döndürür: true / false, eşzamanlı. Gerekenler: Reklamlar açık ve Tam Ekran Reklam → Geçiş Reklamı.

function onLevelDone() {
  var b = window.WebToApk;
  if (b && typeof b.isInterstitialAdReady === 'function' && b.isInterstitialAdReady()) {
    b.showInterstitialAd();               // wait for 'appmint:ad-closed' before continuing
  } else {
    startNextLevel();                     // nothing ready: never block the user
  }
}

window.addEventListener('appmint:ad-closed', function (e) {
  if (e.detail.adType === 'interstitial') startNextLevel();
});

Bitirilen her üçüncü testten sonra ve yalnızca gerçekten bir reklam gösterilecekse reklam gösterin:

var finished = 0;

function onQuizFinished() {
  finished++;
  var b = window.WebToApk;
  var ready = !!(b && typeof b.isInterstitialAdReady === 'function' && b.isInterstitialAdReady());
  if (finished % 3 === 0 && ready) b.showInterstitialAd();
  showResults();                                  // the results are there when the ad closes
}

Yalnızca reklam hazır olduğunda kısa bir "Reklam 3 saniye sonra…" bildirimi gösterin, ardından reklam kapandığında veya gösterilemediğinde devam edin:

var afterAd = null;

function adBreakThen(next) {
  var b = window.WebToApk;
  if (!b || typeof b.isInterstitialAdReady !== 'function' || !b.isInterstitialAdReady()) return next();
  var note = document.getElementById('ad-break'), n = 3;
  note.hidden = false; note.textContent = 'Ad in 3…';
  var t = setInterval(function () {
    if (--n > 0) { note.textContent = 'Ad in ' + n + '…'; return; }
    clearInterval(t); note.hidden = true;
    afterAd = next;
    b.showInterstitialAd();
  }, 1000);
}

function runAfterAd(e) {
  if (e.detail.adType !== 'interstitial' || !afterAd) return;
  var next = afterAd; afterAd = null; next();
}
window.addEventListener('appmint:ad-closed', runAfterAd);
window.addEventListener('appmint:ad-unavailable', runAfterAd);

Notlar: Buradaki true, gösterimin not_loaded veya cooldown nedeniyle reddedilmeyeceği anlamına gelir. Onay veya "Reklamları Kaldır" satın alımı yine de engelleyebilir (appmint:ad-unavailable). Geliştirici tarafından kontrol edilen derlemelerde şunu kullanın AppMintAds.isReady('interstitial').

isRewardedAdReady köprü#

window.WebToApk.isRewardedAdReady(): Boolean

Ödüllü bir reklam yüklenmiş ve şu anda gösterilebiliyorsa true. Sayfanın "Reklam izle" düğmesini buna göre etkinleştirip devre dışı bırakmasını sağlayın (göstermeden önce sorgulayın veya çağırın).

Örnek

Ödüllü bir reklamın yüklenip yüklenmediğini ve şu anda gösterilip gösterilemeyeceğini söyler (Otomatik reklam kontrolü).

Döndürür: true / false, eşzamanlı. Gerekenler: Reklamlar açık ve Tam Ekran Reklam → Ödüllü Reklam.

"Reklam izle" düğmesini yalnızca bir reklam beklerken etkinleştirin:

var btn = document.getElementById('earn');

function refreshWatchButton() {
  var b = window.WebToApk;
  var ready = !!(b && typeof b.isRewardedAdReady === 'function' && b.isRewardedAdReady());
  btn.disabled = !ready;
  btn.textContent = ready ? 'Watch an ad for 10 coins' : 'Loading ad…';
}
refreshWatchButton();
setInterval(refreshWatchButton, 2000);                 // an ad can finish loading at any time
window.addEventListener('appmint:ad-closed', refreshWatchButton);

Oyun bittiğinde "Devam" seçeneğini yalnızca bir reklam beklerken sunun, böylece düğme hiçbir yere çıkmaz:

var continueBtn = document.getElementById('continue-with-ad');

function onGameOver() {
  var b = window.WebToApk;
  continueBtn.hidden = !(b && typeof b.isRewardedAdReady === 'function' && b.isRewardedAdReady());
  showGameOverPanel();                            // "Restart" is always there
}

continueBtn.addEventListener('click', function () {   // the user's own tap
  continueBtn.hidden = true;
  window.WebToApk.showRewardedAd();
});

window.addEventListener('appmint:reward', function () { revivePlayer(); });

Reddedilecek bir gösterimi tetiklemek yerine, dokunma anında kontrol edin ve kullanıcıya ne olduğunu söyleyin:

document.getElementById('hint').addEventListener('click', function () {
  var b = window.WebToApk;
  if (!b || typeof b.isRewardedAdReady !== 'function') return showMessage('Hints need the app.');
  if (typeof b.isPremium === 'function' && b.isPremium()) return revealHint();   // paid to remove ads
  if (b.isRewardedAdReady()) b.showRewardedAd();
  else showMessage('The ad is still loading. Try again in a few seconds.');
});

window.addEventListener('appmint:reward', function () { revealHint(); });

Notlar: Tarayıcıda, reklamlar satın alma ile kaldırıldığında ve ilk reklam yüklenmeden önce false döndürür. Bir reklam gösterildikten sonra bir sonraki kendiliğinden yüklenir. Geliştirici tarafından kontrol edilen derlemelerde şunu kullanın AppMintAds.isReady('rewarded').

notifyUserAction köprü#

window.WebToApk.notifyUserAction()

Dahili (enjekte edilen dokunma sayacı tarafından çağrılır, oluşturucu kodu değil): sayfada anlamlı bir kullanıcı etkileşimi gerçekleşti. "Her N eylemde bir geçiş reklamı" ritmine YALNIZCA hiç URL tabanlı gezinme gözlemlenmediği sürece sayılır - ekranları DOM göster/gizle ile değiştiren tek HTML uygulamaları URL'yi hiç değiştirmez, bu yüzden bu olmadan gezinme sayaçları sonsuza dek 0'da kaldı ve yapılandırılan reklamlar hiç gösterilmedi (TicTrek şikayet sınıfı, 2026-07-26). URL/SPA uygulamaları etkilenmez: ilk gerçek gezinmeleri sayımı kalıcı olarak URL sinyallerine geri çevirir.

Örnek

"Her N eylemde bir tam ekran reklam" ayarı için anlamlı bir kullanıcı eylemini sayar. Uygulama bunu kendi dokunma sayacından kendisi çağırır; sayfalar normalde asla çağırmaz.

Döndürür: hiçbir şey. Gerekenler: Reklamlar açık, Tetikleme Modu → Gezinmelerden Sonra ayarlı bir Tam Ekran Reklam ve Otomatik reklam kontrolü.

Nasıl çalışır: ekranları DOM öğelerini gizleyip göstererek değiştiren bir sayfa URL'sini asla değiştirmez; bu yüzden uygulama bir "gezinme" göremez. Bu nedenle uygulama, bu yöntemi çağıran bir dokunma sayacı (2 saniyede en fazla bir sayım) ekler. Uygulama gerçek bir URL değişikliği gördüğü anda (bir sayfa yüklemesi, pushState veya bir #hash), bunun yerine URL değişikliklerini sayar ve bu yöntem saymayı bırakır.

Yalnızca ekran değişiklikleriniz bir dokunuştan gelmiyorsa (örneğin bir klavye veya oyun kumandası hareketi), bunları kendiniz bildirin:

function goToScreen(name) {
  showScreen(name);                                   // your own DOM show/hide
  var b = window.WebToApk;
  if (b && typeof b.notifyUserAction === 'function') b.notifyUserAction();
}

document.addEventListener('keydown', function (e) {
  if (e.key === 'Enter') goToScreen('next');
});

Kullanıcının sonraki ekrana kaydırdığı kart tarzı bir uygulama (kaydırma bir düğmeye dokunma değildir, bu yüzden dokunma sayacı onu görmez):

var startX = null;

document.addEventListener('touchstart', function (e) { startX = e.touches[0].clientX; }, { passive: true });

document.addEventListener('touchend', function (e) {
  if (startX === null) return;
  var dx = e.changedTouches[0].clientX - startX;
  startX = null;
  if (Math.abs(dx) < 80) return;                       // not a swipe
  showScreen(dx < 0 ? 'next' : 'previous');            // your own DOM show/hide
  var b = window.WebToApk;
  if (b && typeof b.notifyUserAction === 'function') b.notifyUserAction();
});

Oyuncunun A düğmesiyle başlattığı her seviye için bir eylem sayan, oyun kumandasıyla oynanan bir HTML5 oyunu:

var aWasDown = false;

function pollPad() {
  var pad = navigator.getGamepads ? navigator.getGamepads()[0] : null;
  var aDown = !!(pad && pad.buttons[0] && pad.buttons[0].pressed);
  if (aDown && !aWasDown && isOnLevelSelect()) {       // your own game state
    startSelectedLevel();
    var b = window.WebToApk;
    if (b && typeof b.notifyUserAction === 'function') b.notifyUserAction();
  }
  aWasDown = aDown;
  requestAnimationFrame(pollPad);
}

window.addEventListener('gamepadconnected', function () { requestAnimationFrame(pollPad); }, { once: true });

Notlar: Reklamlar kapalıyken, satın alma ile kaldırılmışken veya derleme Reklam Kontrolü → Geliştirici tarafından kontrol edilen kullanıyorsa hiçbir şey yapmaz (orada AppMintAds.show() çağrısını kendiniz yaparsınız). Bu yolla ulaşılan ödüllü reklam her zaman "Reklam izlensin mi? / Hayır, teşekkürler" sorusuyla sunulur, asla zorlanmaz. Her dokunuşta çağırmayın; bu, yapılandırdığınızdan daha sık reklam gösterir.

showInterstitialAd köprü#

window.WebToApk.showInterstitialAd()

Şimdi bir geçiş reklamı göster (örn. seviyeler arasında / bilinçli bir eylemde). Şu anda gösterilemiyorsa → atlanır + nedeniyle 'appmint:ad-unavailable'.

Örnek

Şimdi tam ekran bir geçiş reklamı gösterir, örneğin iki oyun seviyesi arasında (Otomatik reklam kontrolü).

Döndürür: hiçbir şey. Reklam kapandığında appmint:ad-closed olayı {adType:'interstitial', earned:false} ile tetiklenir. Gösterilemediğinde appmint:ad-unavailable olayı {adType:'interstitial', reason} ile tetiklenir. Gerekenler: Reklamlar açık ve Tam Ekran Reklam → Geçiş Reklamı. Ne zaman olacağına yalnızca sayfanızın karar vermesini istiyorsanız Tetikleme Modu → İsteğe Bağlı seçin.

var bridge = window.WebToApk;
var waitingForAd = false;

function levelFinished() {
  if (bridge && typeof bridge.isInterstitialAdReady === 'function' && bridge.isInterstitialAdReady()) {
    waitingForAd = true;
    bridge.showInterstitialAd();          // the next level starts when the ad closes
  } else {
    showNextLevel();                      // no ad ready: just continue
  }
}

window.addEventListener('appmint:ad-closed', function (e) {
  if (e.detail.adType === 'interstitial' && waitingForAd) { waitingForAd = false; showNextLevel(); }
});

window.addEventListener('appmint:ad-unavailable', function (e) {
  // reason: ad_free | disabled | consent | not_loaded | cooldown | show_failed
  if (e.detail.adType === 'interstitial' && waitingForAd) { waitingForAd = false; showNextLevel(); }
});

Oyunu ve sesini reklamdan önce duraklatın, her iki cevapta da devam ettirin:

var pausedForAd = false;

function adBetweenRounds() {
  var b = window.WebToApk;
  if (!b || typeof b.showInterstitialAd !== 'function') return;
  pausedForAd = true;
  pauseGame(); music.pause();
  b.showInterstitialAd();
}

function resumeAfterAd(e) {
  if (e.detail.adType !== 'interstitial' || !pausedForAd) return;
  pausedForAd = false;
  music.play(); resumeGame();
}
window.addEventListener('appmint:ad-closed', resumeAfterAd);
window.addEventListener('appmint:ad-unavailable', resumeAfterAd);

Reklamdan sonra bir makaleyi, reklam gösterildiğinde true ve atlandığında false ile sonuçlanan tek bir Promise olarak açın:

function interstitialThen() {
  return new Promise(function (resolve) {
    var b = window.WebToApk;
    if (!b || typeof b.isInterstitialAdReady !== 'function' || !b.isInterstitialAdReady()) return resolve(false);
    function done(e) {
      if (e.detail.adType !== 'interstitial') return;
      window.removeEventListener('appmint:ad-closed', done);
      window.removeEventListener('appmint:ad-unavailable', done);
      resolve(e.type === 'appmint:ad-closed');
    }
    window.addEventListener('appmint:ad-closed', done);
    window.addEventListener('appmint:ad-unavailable', done);
    b.showInterstitialAd();
  });
}

interstitialThen().then(function () { openArticle(articleId); });

Notlar: Uygulama iki geçiş reklamı arasında en az 60 saniye tutar; bu aralıktaki bir çağrı cooldown döndürür. isInterstitialAdReady() bekleme süresini zaten içerir, bu yüzden önce onu kontrol etmek olayı önler. Geçiş reklamlarını doğal aralarda gösterin, asla her dokunuşta değil. Geliştirici tarafından kontrol edilen derlemelerde şunu kullanın AppMintAds.show('interstitial').

showRewardedAd köprü#

window.WebToApk.showRewardedAd()

Ödüllü bir reklamı ŞİMDİ göster (kullanıcı başlatmalı - ödüllüyü göstermenin politikaya uygun tek yolu). Hiç otomatik uygulama açılış/gezinme reklamı OLMADAN ödüllü reklamlar almak için sihirbazda "İsteğe Bağlı" tetikleme moduyla eşleştirin. Ödül sayfaya deliverRewardToPage() ile iletilir: window.addEventListener('appmint:reward', e => { /* e.detail = {type,amount} */ }) Reklam kapandığında 'appmint:ad-closed' {adType:'rewarded', earned} ile tetiklenir - kullanıcı erken çıktıysa earned false olur, bu durumda hiçbir şey vermeyin. Şu anda gösterilemiyorsa → atlanır + 'appmint:ad-unavailable' nedeniyle tetiklenir.

Örnek

Kullanıcının kendi "Reklam izle" dokunuşundan şimdi ödüllü bir reklam gösterir (Otomatik reklam kontrolü).

Döndürür: hiçbir şey. Sonuç daha sonra olaylar olarak gelir: reklam sonuna kadar izlendiğinde appmint:reward {type, amount}, kapandığında appmint:ad-closed {adType:'rewarded', earned}, hiçbir şey gösterilemediğinde appmint:ad-unavailable {adType:'rewarded', reason}. Gerekenler: Reklamlar açık, Tam Ekran Reklam → Ödüllü Reklam ve hiçbir şeyin kendiliğinden gösterilmemesi için Tetikleme Modu → İsteğe Bağlı.

Ödülü yalnızca ödül işleyicisinde verin, asla dokunuşta değil:

var btn = document.getElementById('earn');
var bridge = window.WebToApk;

function refresh() {
  btn.disabled = !(bridge && typeof bridge.isRewardedAdReady === 'function' && bridge.isRewardedAdReady());
}
refresh();
setInterval(refresh, 2000);

btn.addEventListener('click', function () {        // a real user tap: the only place to call it
  if (!bridge || typeof bridge.showRewardedAd !== 'function') return;
  btn.disabled = true;
  bridge.showRewardedAd();
});

// GRANT HERE ONLY: the ad was watched to the end.
window.addEventListener('appmint:reward', function (e) {
  addCoins(e.detail.amount);                        // e.detail = {type, amount}
});

// The ad closed. earned === false means the user left early: grant nothing.
window.addEventListener('appmint:ad-closed', function (e) {
  if (e.detail.adType === 'rewarded' && !e.detail.earned) showMessage('No reward: the ad was closed early.');
  refresh();
});

// Nothing could be shown.
window.addEventListener('appmint:ad-unavailable', function (e) {
  // e.detail = {adType, reason}; reason: ad_free | disabled | consent | not_loaded | show_failed
  if (e.detail.reason === 'ad_free') addCoins(1);   // the user paid to remove ads: reward anyway
  else showMessage('No ad right now. Try again in a moment.');
  refresh();
});

Aynı üç an, her biri için tek bir işlev tercih ederseniz sayfa kancalarını da çağırır (her biri şununla aynı nesneyi alır e.detail):

window.onAppMintReward = function (reward) { addCoins(reward.amount); };      // {type, amount}
window.onAppMintAdClosed = function (info) { console.log(info.adType, info.earned); };
window.onAppMintAdUnavailable = function (info) { console.log(info.adType, info.reason); };

Çağrıyı ve olaylarını tek bir Promise'e sarın, böylece her "Reklam izle" düğmesi normal bir async çağrısı gibi okunur:

function watchRewardedAd() {                      // call it inside the user's tap
  return new Promise(function (resolve) {
    var b = window.WebToApk;
    if (!b || typeof b.showRewardedAd !== 'function') return resolve({ earned: false, reason: 'no_app' });
    function done(e) {
      if (e.detail.adType !== 'rewarded') return;
      window.removeEventListener('appmint:ad-closed', done);
      window.removeEventListener('appmint:ad-unavailable', done);
      resolve(e.type === 'appmint:ad-closed' ? { earned: e.detail.earned } : { earned: false, reason: e.detail.reason });
    }
    window.addEventListener('appmint:ad-closed', done);
    window.addEventListener('appmint:ad-unavailable', done);
    b.showRewardedAd();
  });
}

document.getElementById('revive').addEventListener('click', function () {
  watchRewardedAd().then(function (r) {
    if (r.earned || r.reason === 'ad_free') revivePlayer();
    else if (r.reason) showMessage('No ad right now.');
  });
});

Notlar: Yalnızca bir tıklama işleyicisinden çağırın. Asla bir zamanlayıcıdan, sayfa yüklemesinden veya rota değişiminden çağırmayın ve temel bir özelliği asla arkasına koymayın. not_loaded ayrıca yeni bir yükleme başlatır, bu yüzden bir sonraki dokunuş genellikle çalışır. Reklam Kontrolü → Geliştirici tarafından kontrol edilen derlemelerinde bunun yerine Promise ile cevap veren AppMintAds.show('rewarded') kullanın.

Her belge derlemesinde uygulama çalışma zamanından ve örnek dosyalarından oluşturulur. Markdown olarak okuyun · Tüm aileler.

22.10.2026 tarihinde yayınlanan köprüyle karşılaştırılarak kontrol edildi.