Ücretsiz APK oluştur

JavaScript köprü API'si

Push gelen kutusu ve kitle

Oluşturucunun bir panelden gönderdiği mesajlar cihazda tutulur; böylece sayfa yalnızca bildirim çekmecesi pop-up'ı yerine bir geçmiş gösterebilir. Ayrıca oturum açmış kullanıcı kimliği ve etiketler, gönderim merkezinin tek bir kullanıcıyı veya etiketi hedeflemesini ve terk edilmiş sepet hatırlatması gibi otomasyonları tetiklemesini sağlar.

AppMint.trackEvent yardımcı#

window.AppMint.trackEvent

Örnek

WebToApk.trackEvent ile birlikte belgelenmiştir - oradaki örnek bunu da gösterir.

Uygulamaya bir şeyin gerçekleştiğini bildirir ("signed_up", "checkout_done", "level:3"). Oluşturucunun AppMint Push gönderim merkezinde "Bir olay gerçekleştiğinde" tetikleyicisiyle ve aynı adla hazırladığı bir uygulama içi mesaj hemen (veya oluşturucunun seçtiği bekleme süresinden sonra) gösterilir.

DΓΆner deΔer: olay alΔ±ndΔ±ysa true; harf, rakam ve _ . : - (en fazla 64) dΔ±ΕΔ±nda bir ad iΓ§in ve AppMint Push olmadan derlenmiΕ bir uygulamada false. AppMint.trackEvent(name, props) aynΔ± Γ§aΔrΔ±dΔ±r, props bir nesne olarak. Gerekenler: derleme yaparken Entegrasyon adΔ±mΔ±nda (AdΔ±m 3) AppMint Push aΓ§Δ±k olmalΔ±. propsJson isteΔe baΔlΔ±dΔ±r ('') ve saklanmaz.

// After a purchase: the creator's "Thanks, rate us?" message is set to trigger on "purchase_done".
function onPurchaseDone(order) {
  if (window.AppMint && AppMint.trackEvent) {
    AppMint.trackEvent('purchase_done', { total: order.total });
  }
}

Ham köprü özellikleri JSON metni olarak alır (hiç yoksa '' gönderin):

function track(name, props) {
  if (!(window.WebToApk && window.WebToApk.trackEvent)) return false;   // a browser: nothing to show
  return WebToApk.trackEvent(name, props ? JSON.stringify(props) : '');
}
track('level:3');
track('tutorial_skipped', { step: 2 });

Adresin göstermediği bir ekran değişikliği (sekmeler, bir sihirbaz, bir modal "sayfa") rota olarak bildirilebilir; böylece oluşturucunun "Bir sayfada" mesajları onu görür. Sayfa ayrıca yolla birlikte appmint:route olayını gönderebilir; uygulama onu dinler:

function showTab(name) {
  document.querySelectorAll('.tab').forEach(function (t) { t.hidden = t.id !== name; });
  if (window.AppMint && AppMint.trackEvent) AppMint.trackEvent('appmint:route', { path: '/' + name });
}

// Same thing, without touching the bridge at all:
window.dispatchEvent(new CustomEvent('appmint:route', { detail: { path: '/cart' } }));

Notlar: rota mesajları gerçek URL değişikliklerini (sayfa yüklemeleri, history.pushState, #/hash rotaları) zaten kendiliğinden izler; yalnızca adresin değişmediği görünümler için rota bildirin. Olaylar hiçbir yerde sayılmaz veya saklanmaz; yalnızca bir mesajın gösterilip gösterilmeyeceğine karar verir.

clearPushInbox köprü#

window.WebToApk.clearPushInbox(): Boolean

Push gelen kutusunu boşaltır (bildirim çekmecesi ve sunucu geçmişi etkilenmez).

Örnek

Bu telefondaki push gelen kutusunu boşaltır.

Döndürür: tamamlandığında true; dahili bir hatada false. Gerekli: derleme yaparken Entegrasyon adımında (Adım 3) AppMint Push özelliğini açın.

document.getElementById('clear-inbox').addEventListener('click', function () {
  if (!(window.WebToApk && window.WebToApk.clearPushInbox)) return;
  if (!confirm('Delete all messages? This cannot be undone.')) return;
  if (WebToApk.clearPushInbox()) renderInbox();
});

Kullanıcı oturumu kapattığında gelen kutusunu boşaltın; böylece bu telefondaki sonraki kişi onların mesajlarını görmez:

async function signOut() {
  await myAuth.signOut();
  if (window.WebToApk && window.WebToApk.clearPushInbox) {
    WebToApk.clearPushInbox();
  }
  document.getElementById('bell-count').textContent = '';
  showLoginScreen();
}

KaΓ§ mesajΔ±n saklandΔ±ΔΔ±nΔ± gΓΆsteren, silinecek bir Εey olmadΔ±ΔΔ±nda devre dΔ±ΕΔ± bir ayarlar satΔ±rΔ± gΓΆsterin:

function paintClearRow() {
  const btn = document.getElementById('clear-inbox');
  if (!(window.WebToApk && window.WebToApk.clearPushInbox)) { btn.hidden = true; return; }
  const count = JSON.parse(WebToApk.getPushInbox() || '[]').length;
  btn.textContent = count ? 'Delete ' + count + ' messages' : 'No messages';
  btn.disabled = count === 0;
}

document.getElementById('clear-inbox').addEventListener('click', function () {
  if (WebToApk.clearPushInbox()) paintClearRow();
  else alert('Could not delete the messages. Please try again.');
});

paintClearRow();

Notlar: bu kalΔ±cΔ±dΔ±r - dismissPushMessage iΕleminin aksine geri alma yoktur. Tepsi bildirimlerine ve AppMint'teki gΓΆnderim geΓ§miΕinize dokunulmaz. Yeni mesajlar yine gelir.

dismissPushMessage köprü#

window.WebToApk.dismissPushMessage(id: String): Boolean

Gelen kutusundan BİR mesajı kaldırır; bir gelen kutusu ekranının ihtiyaç duyduğu satır başına kaydırarak kaldırma (clearPushInbox ya hep ya hiç çalışır). Tasarım gereği GERİ ALINABİLİR: kayıt yok edilmez, gizlenir; böylece arayüz kaydırmadan sonra birkaç saniye boyunca "Geri al" sunabilir. Yalnızca yerel: bildirim çekmecesi ve oluşturucunun geçmişi etkilenmez.

Örnek

Bir mesajı push gelen kutusundan gizler (kaydırarak kaldırma). Şununla geri alınabilir: restorePushMessage(id).

DΓΆner deΔer: mesaj gizlendiyse true; kimlik bilinmiyorsa veya zaten gizlenmiΕse false. Gerekenler: derleme yaparken Entegrasyon adΔ±mΔ±nda (AdΔ±m 3) AppMint Push aΓ§Δ±n.

5 saniyelik Geri Al ile kaydırarak kaldırın:

function dismissRow(id, rowEl) {
  if (!(window.WebToApk && window.WebToApk.dismissPushMessage)) return;
  if (!WebToApk.dismissPushMessage(id)) return;
  rowEl.remove();

  const bar = document.getElementById('undo-bar');
  bar.hidden = false;
  const timer = setTimeout(function () { bar.hidden = true; }, 5000);
  document.getElementById('undo-btn').onclick = function () {
    clearTimeout(timer);
    bar.hidden = true;
    WebToApk.restorePushMessage(id);         // back in its old place
    renderInbox();
  };
}

Gelen kutusu aΓ§Δ±ldΔ±ΔΔ±nda, okunmuΕ ve 30 gΓΌnden eski mesajlarΔ± gizleyerek dΓΌzenleyin:

function hideOldReadMessages() {
  if (!(window.WebToApk && window.WebToApk.dismissPushMessage)) return 0;
  const cutoff = Date.now() - 30 * 24 * 60 * 60 * 1000;
  let hidden = 0;
  JSON.parse(WebToApk.getPushInbox() || '[]').forEach(function (m) {
    if (m.read && m.receivedAt < cutoff && WebToApk.dismissPushMessage(m.id)) hidden++;
  });
  return hidden;
}

if (hideOldReadMessages() > 0) renderInbox();

Bir satırı gerçek bir parmak kaydırmasıyla kaldırın (genişliğinin %40'ından fazla sürükleyin):

function makeSwipeable(rowEl, id) {
  let startX = null;
  rowEl.addEventListener('pointerdown', function (e) { startX = e.clientX; rowEl.setPointerCapture(e.pointerId); });
  rowEl.addEventListener('pointermove', function (e) {
    if (startX !== null) rowEl.style.transform = 'translateX(' + (e.clientX - startX) + 'px)';
  });
  rowEl.addEventListener('pointerup', function (e) {
    const dx = startX === null ? 0 : e.clientX - startX;
    startX = null;
    if (Math.abs(dx) > rowEl.offsetWidth * 0.4 && window.WebToApk && WebToApk.dismissPushMessage(id)) {
      rowEl.remove();
    } else {
      rowEl.style.transform = '';            // not far enough: snap back
    }
  });
}

Notlar: yalnızca bu telefonun gelen kutusu değişir. Bildirim çekmecesindeki bildirim ve AppMint'teki gönderim geçmişiniz kalır. Gizlenen mesajlar şu işlevle döndürülmez: getPushInbox().

getInAppCampaigns köprü#

window.WebToApk.getInAppCampaigns(): String

Bu kurulumun tuttuğu uygulama içi mesajlar: JSON [{id, name}] (AppMint Push olmadan "[]").

Örnek

Bu kurulumun Εu anda tuttuΔu uygulama iΓ§i mesajlarΔ±nΔ± (bu kullanΔ±cΔ±nΔ±n kitlesinde olduΔu, AppMint Push gΓΆnderim merkezindeki yaratΔ±cΔ± kampanyalarΔ±) bir JSON dizesi olarak listeler [{"id": "...", "name": "..."}].

DΓΆner deΔer: bir JSON dizi dizesi; hiΓ§ yoksa ve AppMint Push olmadan derlenmiΕ bir uygulamada "[]". Gerekenler: derleme yaparken Entegrasyon adΔ±mΔ±nda (AdΔ±m 3) AppMint Push aΓ§Δ±k olmalΔ±. Liste her uygulama baΕlangΔ±cΔ±nda (ve ΓΆn planda yaklaΕΔ±k saatte bir) yenilenir.

var list = [];
if (window.WebToApk && window.WebToApk.getInAppCampaigns) {
  try { list = JSON.parse(WebToApk.getInAppCampaigns()); } catch (e) {}
}
console.log('in-app messages on this phone:', list.map(function (c) { return c.name; }));

Kendi yΓΆnetici ekranΔ±nΔ±zda bir hata ayΔ±klama listesi gΓΆsterin:

function renderInAppDebug(el) {
  var raw = (window.WebToApk && WebToApk.getInAppCampaigns) ? WebToApk.getInAppCampaigns() : '[]';
  var items = JSON.parse(raw);
  el.innerHTML = items.length
    ? items.map(function (c) { return '<li>' + c.name + ' <code>' + c.id + '</code></li>'; }).join('')
    : '<li>No in-app messages for this install</li>';
}
renderInAppDebug(document.getElementById('inapp-debug'));

Oluşturucu zaten bu adla bir mesaj çalıştırıyorsa kendi karşılama ipucunuzu atlayın:

function hasCampaign(name) {
  try { return JSON.parse(WebToApk.getInAppCampaigns()).some(function (c) { return c.name === name; }); }
  catch (e) { return false; }
}
if (!hasCampaign('Welcome tour')) showMyOwnWelcome();

Notlar: yalnΔ±zca kimlik ve ad aΓ§Δ±ΔΔ±a Γ§Δ±karΔ±lΔ±r; mesajΔ±n kendisi gΓΆsterildiΔinde sayfaya appmint:inapp olayΔ± ΓΌzerinden ulaΕΔ±r (bkz. setInAppPresentation).

getPushInbox köprü#

window.WebToApk.getPushInbox(): String

AppMint Push gelen kutusu (yaratΔ±cΔ± tarafΔ±ndan gΓΆnderilen mesajlar, en yeniden eskiye, en fazla 50): {id, title, body, imageUrl, link, receivedAt, read} JSON dizisi. Her zaman tam gΓΌncel gerΓ§ek β geΓ§ aΓ§Δ±lan bir uygulama canlΔ± `appmint:push` olaylarΔ±nΔ± kaΓ§Δ±rmaktan hiΓ§bir Εey kaybetmez.

Örnek

AppMint Push ile gönderdiğiniz push mesajlarının uygulama içi gelen kutusunu okur: en yeni önce, en fazla 50, kullanıcının kaldırdıkları hariç.

DΓΆner deΔer: eΕzamanlΔ± olarak bir JSON dizesi. AyrΔ±ΕtΔ±rΔ±n. Her ΓΆΔe: { id, title, body, imageUrl, link, receivedAt, read } (receivedAt epoch ms olarak; imageUrl ve link mesajda yoksa ''), ayrΔ±ca AppMint'te bir Εablon kullandΔ±ysanΔ±z isteΔe baΔlΔ± tasarΔ±m alanlarΔ±: template, accent, iconUrl, buttons: [{label, link}], badge, inapp, countdownAt, progress, lines, collapse. BoΕsa '[]'. Gerekenler: derleme yaparken Entegrasyon adΔ±mΔ±nda (AdΔ±m 3) AppMint Push aΓ§Δ±n; o olmadan gelen kutusu her zaman boΕtur.

Gelen kutusunu Γ§izin ve appmint:push ile canlΔ± yenileyin:

function loadInbox() {
  if (!(window.WebToApk && window.WebToApk.getPushInbox)) return [];
  try { return JSON.parse(WebToApk.getPushInbox() || '[]'); } catch (e) { return []; }
}

function renderInbox() {
  const inbox = loadInbox();
  const unread = inbox.filter(function (m) { return !m.read; }).length;
  document.getElementById('bell-count').textContent = unread ? String(unread) : '';
  const ul = document.getElementById('inbox');
  ul.innerHTML = '';
  inbox.forEach(function (m) {
    const li = document.createElement('li');
    li.className = m.read ? 'read' : 'unread';
    li.textContent = m.title + ' — ' + m.body;
    li.onclick = function () {
      WebToApk.markPushRead(m.id);
      if (m.link) location.href = m.link;
      renderInbox();
    };
    ul.appendChild(li);
  });
}

// While the app is open:
window.addEventListener('appmint:push', function (e) {
  // { type: 'received', message: {id, title, body, ...}, presented: true|false }
  // { type: 'revoked', id }  — you retracted the message
  // presented = the app already showed it on screen (see setPushPresentation)
  if (e.detail.type === 'received' && !e.detail.presented) showBanner(e.detail.message.title);
  renderInbox();
});

renderInbox();

Kullanıcı uygulamaya her döndüğünde zilinizdeki okunmamış sayısını güncelleyin (arka plandayken gelen mesajlar zaten gelen kutusundadır):

function unreadCount() {
  if (!(window.WebToApk && window.WebToApk.getPushInbox)) return 0;
  try {
    return JSON.parse(WebToApk.getPushInbox() || '[]').filter(function (m) { return !m.read; }).length;
  } catch (e) { return 0; }
}

function paintBell() {
  const n = unreadCount();
  const badge = document.getElementById('bell-count');
  badge.textContent = n > 9 ? '9+' : (n ? String(n) : '');
  badge.hidden = n === 0;
}

document.addEventListener('visibilitychange', function () {
  if (document.visibilityState === 'visible') paintBell();
});
paintBell();

Bir mesajın görselini ve düğmelerini (yalnızca bunlarla tasarladıysanız) geliş saatiyle birlikte gösterin:

function renderCard(m) {
  const card = document.createElement('article');
  if (m.accent) card.style.borderLeft = '4px solid ' + m.accent;
  if (m.imageUrl) {
    const img = document.createElement('img');
    img.src = m.imageUrl; img.alt = '';
    card.appendChild(img);
  }
  const h = document.createElement('h3');
  h.textContent = m.title;
  const p = document.createElement('p');
  p.textContent = m.body;
  const time = document.createElement('time');
  time.textContent = new Date(m.receivedAt).toLocaleString();
  card.append(h, p, time);
  (m.buttons || []).forEach(function (b) {
    const btn = document.createElement('button');
    btn.textContent = b.label;
    btn.onclick = function () { WebToApk.markPushRead(m.id); if (b.link) location.href = b.link; };
    card.appendChild(btn);
  });
  return card;
}

if (window.WebToApk && window.WebToApk.getPushInbox) {
  const list = document.getElementById('inbox');
  JSON.parse(WebToApk.getPushInbox() || '[]').forEach(function (m) { list.appendChild(renderCard(m)); });
}

Notlar: gelen kutusu telefonda tutulur, bu yüzden ekranınız açıldığında okuyun; olaylar yalnızca uygulama ekrandayken gelir. AppMint'ten geri çektiğiniz bir mesaj gelen kutusundan ve bildirim çekmecesinden kaybolur. "Yalnızca push" (çekmece) olarak gönderilen mesajlar gelen kutusuna eklenmez. Aynı ayrıntı, tanımladıysanız window.onAppMintPush(detail) işlevine de iletilir.

getPushTags köprü#

window.WebToApk.getPushTags(): String

Bu kurulumun etiketleri, JSON nesnesi metni olarak, örn. {"plan":"pro"}.

Örnek

Bu kurulumun AppMint Push etiketlerini okur.

Döndürür: eşzamanlı olarak bir JSON metni - metin değerlerinden oluşan bir nesne, örn. '{"plan":"pro","cart":"open"}'; hiç yoksa '{}'. Ayrıştırın. Gerekli: derleme yaparken Entegrasyon adımında (Adım 3) AppMint Push özelliğini açın.

Tek bir etiketi okuyun:

function pushTags() {
  if (!(window.WebToApk && window.WebToApk.getPushTags)) return {};
  try { return JSON.parse(WebToApk.getPushTags() || '{}'); } catch (e) { return {}; }
}

const plan = pushTags().plan || 'free';

Etiketi yalnΔ±zca deΔiΕtiΔinde ayarlayΔ±n - her setPushTag Γ§aΔrΔ±sΔ± kurulumun AppMint Push'a baΔlanmasΔ±na neden olur, bu yΓΌzden hiΓ§bir Εeyi deΔiΕtirmeyenleri atlayΔ±n:

function ensureTag(key, value) {
  if (!(window.WebToApk && window.WebToApk.getPushTags)) return;
  const tags = JSON.parse(WebToApk.getPushTags() || '{}');
  if ((tags[key] || '') !== value) WebToApk.setPushTag(key, value);
}

ensureTag('plan', user.isPro ? 'pro' : 'free');

Bir etikete gΓΆnderimi test ederken bunlarΔ± bir hata ayΔ±klama ekranΔ±nda listeleyin:

const list = document.getElementById('push-tags');
if (window.WebToApk && window.WebToApk.getPushTags) {
  const tags = JSON.parse(WebToApk.getPushTags() || '{}');
  list.textContent = Object.keys(tags).length
    ? Object.keys(tags).map(function (k) { return k + ' = ' + tags[k]; }).join('\n')
    : 'No tags yet';
}

Notlar: bu, telefonun tuttuğu durumdur; gönderim merkezi bunu kurulumun bir sonraki check-in'inden sonra, telefon çevrimiçiyse değişiklikten birkaç saniye sonra görür.

getPushUser köprü#

window.WebToApk.getPushUser(): String

setPushUser ile son ayarlanan kullanıcı kimliği (oturum kapalıysa veya hiç ayarlanmadıysa "").

Örnek

Bu kurulumun AppMint Push'a en son verdiği kullanıcı kimliğini okur, şununla: setPushUser.

Döndürür: eşzamanlı olarak bir string - kaydedilmiş kimlik, ya da kimse oturum açmamışsa veya hiç ayarlanmamışsa ''. Gerekli: derleme yaparken Entegrasyon adımında (Adım 3) AppMint Push özelliğini açın.

Kimliği yalnızca değiştiğinde ayarlayın (her uygulama başlangıcında):

function syncPushUser(currentUserId) {
  if (!(window.WebToApk && window.WebToApk.getPushUser)) return;
  const want = currentUserId || '';
  if (WebToApk.getPushUser() !== want) WebToApk.setPushUser(want);
}

syncPushUser(localStorage.getItem('userId'));

Uygulama kapalıyken kendi oturumunuzun süresi dolduysa eski bir kimliği temizleyin:

async function checkSession() {
  const session = await myBackend.currentSession();       // null when expired
  if (!session && window.WebToApk && window.WebToApk.getPushUser && WebToApk.getPushUser() !== '') {
    WebToApk.setPushUser('');                              // stop personal messages to this phone
  }
}

checkSession();

Tek bir kullanıcıya gönderimi test ederken bunu bir hata ayıklama ekranında gösterin:

const info = document.getElementById('push-debug');
if (window.WebToApk && window.WebToApk.getPushUser) {
  const id = WebToApk.getPushUser();
  info.textContent = id ? 'Push user: ' + id : 'Push user: nobody signed in';
} else {
  info.textContent = 'Not inside the app';
}

Notlar: bu, telefonun tuttuğu durumdur. Gönderim merkezi değişikliği kurulumun bir sonraki check-in'inden sonra, telefon çevrimiçiyse birkaç saniye sonra görür.

markPushRead köprü#

window.WebToApk.markPushRead(id: String): Boolean

Bir push mesajını okundu olarak işaretler; tüm mesajları okundu işaretlemek için "" gönderin.

Örnek

Bir push gelen kutusu mesajΔ±nΔ± okundu olarak iΕaretler veya verildiΔinde hepsini ''.

DΓΆner deΔer: bir mesaj deΔiΕtiyse true; hiΓ§bir Εey deΔiΕmediyse false (bilinmeyen kimlik, zaten okunmuΕ veya AppMint Push etkin deΔil). Gerekenler: derleme yaparken Entegrasyon adΔ±mΔ±nda (AdΔ±m 3) AppMint Push aΓ§Δ±n.

function openMessage(id) {
  if (!(window.WebToApk && window.WebToApk.markPushRead)) return;
  WebToApk.markPushRead(id);                 // one message
  updateBellCount();
}

document.getElementById('mark-all-read').addEventListener('click', function () {
  if (!(window.WebToApk && window.WebToApk.markPushRead)) return;
  WebToApk.markPushRead('');                 // every message
  updateBellCount();
});

function updateBellCount() {
  const inbox = JSON.parse(WebToApk.getPushInbox() || '[]');
  const unread = inbox.filter(function (m) { return !m.read; }).length;
  document.getElementById('bell-count').textContent = unread ? String(unread) : '';
}

Bir mesajΔ±, yalnΔ±zca dokunduΔunda deΔil, kullanΔ±cΔ± onu ekranda gerΓ§ekten gΓΆrdΓΌkten sonra okundu olarak iΕaretleyin:

if (window.WebToApk && window.WebToApk.markPushRead) {
  const seen = new IntersectionObserver(function (entries) {
    entries.forEach(function (entry) {
      if (!entry.isIntersecting) return;
      const id = entry.target.dataset.msgId;
      seen.unobserve(entry.target);
      if (WebToApk.markPushRead(id)) {       // true only when it was unread
        entry.target.classList.replace('unread', 'read');
        updateBellCount();
      }
    });
  }, { threshold: 0.6 });

  document.querySelectorAll('#inbox li.unread').forEach(function (li) { seen.observe(li); });
}

Gelen kutusu ekranı açıldığında rozeti temizleyin ve yalnızca gerçekten okunmamış bir şey varsa yeniden çizin:

function openInboxScreen() {
  showScreen('inbox');
  if (!(window.WebToApk && window.WebToApk.markPushRead)) return;
  const changed = WebToApk.markPushRead('');  // false: nothing was unread
  if (changed) {
    document.getElementById('bell-count').textContent = '';
    renderInbox();
  }
}

Notlar: okundu durumu yalnızca bu telefonda saklanır. Bildirim çekmecesindeki bildirimi kaldırmaz.

restorePushMessage köprü#

window.WebToApk.restorePushMessage(id: String): Boolean

Bir gizlemeyi geri alΔ±r: mesajΔ± gelen kutusundaki yerine geri koyar.

Örnek

dismissPushMessage(id) iΕlemini geri alΔ±r: mesaj eski yerinde push gelen kutusuna geri dΓΆner.

Döndürür: mesaj geri yüklendiyse true; kimlik bilinmiyorsa veya gizli değilse false. Gerekli: derleme yaparken Entegrasyon adımında (Adım 3) AppMint Push özelliğini açın.

let lastDismissed = null;

function onSwipe(id) {
  if (!(window.WebToApk && window.WebToApk.dismissPushMessage)) return;
  if (WebToApk.dismissPushMessage(id)) {
    lastDismissed = id;
    showUndo();
    renderInbox();
  }
}

document.getElementById('undo-btn').addEventListener('click', function () {
  if (!lastDismissed || !window.WebToApk) return;
  if (WebToApk.restorePushMessage(lastDismissed)) renderInbox();
  lastDismissed = null;
});

Birkaç kaydırmayı birden geri alın: bu ekranda gizlenen her mesajı hatırlayın ve hepsini geri getirin:

const hiddenThisVisit = [];

function hide(id) {
  if (window.WebToApk && WebToApk.dismissPushMessage(id)) {
    hiddenThisVisit.push(id);
    document.getElementById('undo-all').hidden = false;
    renderInbox();
  }
}

document.getElementById('undo-all').addEventListener('click', function () {
  if (!(window.WebToApk && window.WebToApk.restorePushMessage)) return;
  hiddenThisVisit.splice(0).forEach(function (id) { WebToApk.restorePushMessage(id); });
  this.hidden = true;
  renderInbox();
});

Kullanıcının sonradan geri yükleyebileceği bir "Son gizlenenler" listesi sunun. getPushInbox() gizlenen mesajları döndürmez, bu yüzden kimliklerini ve başlıklarını kendiniz saklayın:

function loadHidden() {
  try { return JSON.parse(localStorage.getItem('hiddenMsgs') || '[]'); } catch (e) { return []; }
}

function renderHidden() {
  const ul = document.getElementById('recently-hidden');
  ul.innerHTML = '';
  loadHidden().forEach(function (h) {
    const li = document.createElement('li');
    li.textContent = h.title + ' ';
    const btn = document.createElement('button');
    btn.textContent = 'Restore';
    btn.onclick = function () {
      WebToApk.restorePushMessage(h.id);     // false: retracted, cleared or already back
      const rest = loadHidden().filter(function (x) { return x.id !== h.id; });
      try { localStorage.setItem('hiddenMsgs', JSON.stringify(rest)); } catch (e) {}
      renderHidden();
      renderInbox();
    };
    li.appendChild(btn);
    ul.appendChild(li);
  });
}

Notlar: clearPushInbox() ile temizlenen veya sizin AppMint'ten geri çektiğiniz bir mesaj geri yüklenemez.

setInAppPresentation köprü#

window.WebToApk.setInAppPresentation(mode: String): Boolean

Uygulama iΓ§i mesaj sunumu: "auto" (varsayΔ±lan) kabuΔun yaratΔ±cΔ±nΔ±n tasarΔ±mΔ±nΔ± Γ§izmesine izin verir; "none" (kalΔ±cΔ±) her mesajΔ± `appmint:inapp` {type:'shown', presented:false, message} olarak sayfaya verir, sayfa kendisi Γ§izer.

Örnek

Bir uygulama içi mesajı (AppMint Push gönderim merkezinden bir kampanya) tetikleyicisi gerçekleştiğinde kimin çizeceğini seçer: uygulama ('auto', varsayılan: oluşturucunun banner'ı, ortadaki kartı, alt sayfası veya tam ekran tasarımı) ya da kendi sayfanız ('none').

DΓΆner deΔer: mod kaydedildiyse true (deΔiΕtirilene kadar telefonda kalΔ±r); baΕka herhangi bir deΔer iΓ§in ve AppMint Push olmadan derlenmiΕ bir uygulamada false. Gerekenler: derleme yaparken Entegrasyon adΔ±mΔ±nda (AdΔ±m 3) AppMint Push aΓ§Δ±k olmalΔ±.

Her uygulama içi mesaj appmint:inapp olayını tetikler (ve tanımladıysanız window.onAppMintInApp(detail) işlevini çağırır); type değeri 'shown', 'clicked', 'dismissed' veya 'answered' olur (yıldız veya 0-10 puanlı bir yanıt, question ile birlikte ve value):

window.addEventListener('appmint:inapp', function (e) {
  var d = e.detail;   // { type, id, name, template?, presented?, message?, button?, link?, question?, value? }
  if (d.type === 'shown') analytics('inapp_shown', d.name);
  if (d.type === 'clicked') analytics('inapp_clicked', d.name + ' #' + d.button);
  if (d.type === 'dismissed') analytics('inapp_closed', d.name);
  if (d.type === 'answered') analytics('inapp_answer', d.name + ' ' + d.question + '=' + d.value);
});

Mesajları kendiniz çizin; uygulama her birini göstermek yerine size teslim eder:

if (window.WebToApk && WebToApk.setInAppPresentation) WebToApk.setInAppPresentation('none');

window.onAppMintInApp = function (d) {
  if (d.type !== 'shown' || d.presented) return;   // presented = the app already drew it
  var m = d.message;                                // { title, body, imageUrl, link, inapp, accent?, buttons?, emoji?, question?, lines? }
  showMyDialog(m.title, m.body, (m.buttons || []).map(function (b) {
    return { label: b.label, onClick: function () { if (b.link) location.href = b.link; } };
  }));
};

SeΓ§imi uygulamaya geri verin (ΓΆrneΔin bir ayarlar anahtarΔ±ndan):

document.getElementById('native-popups').addEventListener('change', function (e) {
  if (window.WebToApk && WebToApk.setInAppPresentation) {
    WebToApk.setInAppPresentation(e.target.checked ? 'auto' : 'none');
  }
});

Notlar: 'none' ile bir mesaj, sayfaya teslim edildiği anda yine de gösterilmiş sayılır (sıklık sınırları geçerlidir). 'none' ayarı, uygulamanın o anda gösterdiği bir mesajı da kapatır. Push mesajlarının kendi anahtarı vardır, setPushPresentation.

setPushPresentation köprü#

window.WebToApk.setPushPresentation(mode: String): Boolean

Push mesajlarının yerel uygulama içi sunumu: "auto" (varsayılan), uygulama açıkken kabuğun oluşturucunun seçtiği banner / modal / alt sayfa / tam ekran kartı çizmesine izin verir; "none" bunu kalıcı olarak kapatır (saklanır) - kendi çizimini yapan uygulamalar için. `appmint:push` olayı ve gelen kutusu her iki durumda da etkilenmez; alınan olayın `presented` bayrağı kabuğun onu gösterip göstermediğini söyler.

Örnek

UygulamanΔ±n AppMint Push mesajlarΔ±nΔ± ekranda kendi gΓΆstermesini aΓ§ar ('auto', varsayΔ±lan) veya kapatΔ±r ('none') - appmint:push olayΔ±ndan kendi bandΔ±nΔ± Γ§izen uygulamalar iΓ§in.

Döndürür: mod kaydedildiğinde true; 'auto' veya 'none' dışındaki her değer için false. Seçim telefonda kaydedilir ve değiştirilene kadar kalır. Gerekli: derleme yaparken Entegrasyon adımında (Adım 3) AppMint Push özelliğini açın.

Kabuk bandΔ± yerine kendi bandΔ±nΔ±zΔ± Γ§izin:

if (window.WebToApk && window.WebToApk.setPushPresentation) {
  WebToApk.setPushPresentation('none');       // 'auto' to give it back to the shell
}

window.addEventListener('appmint:push', function (e) {
  const d = e.detail;
  // { type: 'received', message: {...}, presented: false } — presented = the shell already showed it
  if (d.type === 'received' && !d.presented) showMyBanner(d.message.title, d.message.body, d.message.link);
  if (d.type === 'revoked') hideMyBanner(d.id);
});

Kullanıcının ayarlar ekranınızdan pop-up'ları kapatmasına izin verin. Okuma işlevi yoktur, bu yüzden anahtarı çizmek için seçimin kendi kopyasını tutun:

const toggle = document.getElementById('show-popups');
let saved = null;
try { saved = localStorage.getItem('pushPopups'); } catch (e) {}
toggle.checked = saved !== 'none';

toggle.addEventListener('change', function () {
  if (!(window.WebToApk && window.WebToApk.setPushPresentation)) return;
  const mode = toggle.checked ? 'auto' : 'none';
  if (WebToApk.setPushPresentation(mode)) {
    try { localStorage.setItem('pushPopups', mode); } catch (e) {}
  }
});

'auto' ile, uygulamanın ekranda gösterdiği bir mesajla kullanıcının ne yaptığını öğrenin: dokunduğunda opened (action mesajın kendisi için -1, aksi halde düğme sırasıdır), dokunmadan kapattığında closed:

window.addEventListener('appmint:push', function (e) {
  const d = e.detail;
  if (d.type === 'opened') {
    // the message is already marked read in the inbox
    track('push_opened', { id: d.id, button: d.action, link: d.link });
    updateBellCount();
  } else if (d.type === 'closed') {
    track('push_closed', { id: d.id });
  }
});

Notlar: 'auto' ile, uygulama içi stille gönderdiğiniz bir mesaj uygulama açıkken üstünde gösterilir (ve bildirim çekmecesine ayrıca konmaz). 'none' ile kabuk onu hiç çizmez; gelen kutusu (getPushInbox) ve appmint:push olayı her iki durumda da aynı çalışır. 'none' ayarı, kabuğun o anda gösterdiği bir mesajı da kapatır.

setPushTag köprü#

window.WebToApk.setPushTag(key: String, value: String): Boolean

Bir AppMint Push etiketi ayarlar (anahtar: harfler, rakamlar, _ en fazla 32; değer en fazla 128). Gönderim merkezi "plan = pro" etiketini hedefleyebilir ve bir otomasyon, etiket ayarlandıktan belirli bir süre sonra tetiklenebilir (terk edilmiş sepet: cart=open ayarlayın, ödeme sırasında temizleyin). Boş değer etiketi kaldırır. Kurulum başına en fazla 50 etiket.

Örnek

Bu kurulumda plan = pro veya city = pune gibi bir AppMint Push etiketi ayarlar. GΓΆnderim merkezi (Ana Sayfa > Bildirimler) bir etikete sahip herkese gΓΆnderebilir ve bir etiket otomasyonu bir etiket ayarlandΔ±ktan belirli bir sΓΌre sonra mesaj gΓΆnderebilir - terk edilmiΕ bir sepet, tamamlanan bir seviye. BoΕ bir deΔer etiketi kaldΔ±rΔ±r.

Döndürür: kaydedildiğinde true; anahtar 1-32 harf, rakam veya _ değilse, değer 128 karakterden uzunsa ya da kurulumda 50'den fazla etiket olacaksa false (bu durumda hiçbir şey kaydedilmez). Etiketler telefonda tutulur ve bir süre sonra (çevrimdışıysa sonraki açılışta) AppMint Push'a bildirilir. Gerekli: derleme yaparken Entegrasyon adımında (Adım 3) AppMint Push özelliğini açın. Etiket hedefleme ve otomasyonlar, 30 Eylül 2026'dan itibaren AppMint ile derlenmiş uygulamaları çalıştıran telefonlara ulaşır.

Kullanıcının satın aldığını veya seçtiğini etiketleyin, böylece yalnızca "plan = pro" olanlara gönderebilirsiniz:

function pushTag(key, value) {
  if (!(window.WebToApk && window.WebToApk.setPushTag)) return false;
  return WebToApk.setPushTag(key, value);
}

pushTag('plan', user.isPro ? 'pro' : 'free');
pushTag('city', user.city.toLowerCase());

Terk edilmiş sepet: sepette ürün olduğunda bir etiket ayarlayın ve ödeme sırasında temizleyin. Gönderim merkezinde cart üzerinde gecikmeli (örneğin 60 dakika) bir etiket otomasyonu ekleyin; süre dolduğunda cart hâlâ ayarlıysa telefon hatırlatmayı alır:

function onCartChanged(items) {
  if (!(window.WebToApk && window.WebToApk.setPushTag)) return;
  // Setting 'open' again while it is already 'open' does not restart the automation's clock.
  WebToApk.setPushTag('cart', items.length > 0 ? 'open' : '');
}

function onCheckoutComplete() {
  if (window.WebToApk && window.WebToApk.setPushTag) WebToApk.setPushTag('cart', '');   // bought: no reminder
}

Oturum kapatΔ±rken kullanΔ±cΔ±ya ΓΆzel etiketleri temizleyin, kullanΔ±cΔ± kimliΔiyle birlikte:

function signOutOfPush() {
  if (!(window.WebToApk && window.WebToApk.setPushUser)) return;
  WebToApk.setPushUser('');
  WebToApk.setPushTag('plan', '');
  WebToApk.setPushTag('cart', '');
}

Notlar: etiketler oturum açan kullanıcıya değil bu kuruluma aittir. Bir etiketi zaten sahip olduğu değere ayarlamak sunucuda hiçbir şeyi değiştirmez. Bir etiket kaldırıldıktan sonra yeniden ayarlanırsa etiket otomasyonu bir kez daha gönderebilir. Etikete asla e-posta adresi, telefon numarası veya özel bir şey koymayın.

setPushTags köprü#

window.WebToApk.setPushTags(json: String): Boolean

Bir JSON nesne dizesinden aynΔ± anda birkaΓ§ etiket ayarlar; "" deΔerleri kaldΔ±rΔ±r.

Örnek

Bir JSON nesnesi metninden, örn. '{"plan":"pro","team":"red"}', birden fazla AppMint Push etiketini tek seferde ayarlar. "" değeri o etiketi kaldırır; adını vermediğiniz etiketler korunur.

Döndürür: kaydedildiğinde true; metin bir JSON nesnesi değilse, herhangi bir anahtar 1-32 harf, rakam veya _ değilse, herhangi bir değer 128 karakterden uzunsa ya da kurulumda 50'den fazla etiket olacaksa false - bu durumda hiçbir şey kaydedilmez. Gerekli: derleme yaparken Entegrasyon adımında (Adım 3) AppMint Push özelliğini açın. Etiket hedefleme ve otomasyonlar, 30 Eylül 2026'dan itibaren AppMint ile derlenmiş uygulamaları çalıştıran telefonlara ulaşır.

Oturum açtıktan sonra profili tek çağrıda etiketleyin:

function tagProfile(profile) {
  if (!(window.WebToApk && window.WebToApk.setPushTags)) return false;
  return WebToApk.setPushTags(JSON.stringify({
    plan: profile.plan,                   // 'free' | 'pro'
    level: String(profile.level),         // values are text: turn numbers into strings
    team: profile.team || ''              // '' removes the tag
  }));
}

Oturumu kapatırken hepsini kaldırın (mevcut etiketleri okuyun, her birini şu şekilde geri gönderin: ''):

function clearPushTags() {
  if (!(window.WebToApk && window.WebToApk.getPushTags)) return;
  const tags = JSON.parse(WebToApk.getPushTags() || '{}');
  Object.keys(tags).forEach(function (k) { tags[k] = ''; });
  WebToApk.setPushTags(JSON.stringify(tags));
  WebToApk.setPushUser('');
}

Bir seviyeyi bitirdi: etiketleyin ve level_done üzerindeki bir etiket otomasyonunun (örneğin 10 dakika sonra) sonraki görevi göndermesine izin verin:

function onLevelComplete(level, score) {
  if (!(window.WebToApk && window.WebToApk.setPushTags)) return;
  WebToApk.setPushTags(JSON.stringify({
    level_done: String(level),            // a new value each level, so the automation can fire again
    last_score: String(score)
  }));
}

Notlar: bir çağrı bir değişikliktir: ya hepsi kaydedilir ya hiçbiri. Kurulum yeni etiketleri bir süre sonra (çevrimdışıysa sonraki açılışta) AppMint Push'a bildirir.

setPushUser köprü#

window.WebToApk.setPushUser(id: String): Boolean

AppMint Push kitlesi: oluşturucunun gönderim merkezine bu kurulumun KİM olduğunu bildirir; böylece bir mesaj oturum açmış tek bir kullanıcıya ("u_42") ya da bir etiketi olan herkese gönderilebilir. Oturum açtıktan sonra kendi sabit hesap kimliğinizle çağırın; oturumu kapatırken "" gönderin. Harfler, rakamlar ve _ @ . : + - (en fazla 128). Bunun dışındaki her şey için false döner; AppMint Push kullanmayan bir uygulamada (OneSignal / kendi Firebase'iniz) ise hiçbir şey gönderilmez, 2026-10-03. E-posta adresi ya da telefon numarası göndermeyin; veritabanı kimliğinizi kullanın.

Örnek

AppMint Push'a, sizin kullanıcılarınızdan hangisinin bu telefonda oturum açtığını bildirir; böylece gönderim merkezi (Ana Sayfa > Bildirimler) mesajı yalnızca o kullanıcıya gönderebilir. Oturum açtıktan sonra kendi sabit hesap kimliğinizle çağırın; oturumu kapatırken '' ile çağırın.

DΓΆner deΔer: kimlik kaydedildiyse true; harf, rakam ve _ @ . : + - dΔ±ΕΔ±nda bir Εey iΓ§eren veya 128 karakterden uzun bir kimlik iΓ§in false (bu durumda hiΓ§bir Εey kaydedilmez). Kimlik siz deΔiΕtirene kadar telefonda tutulur ve bu kurulum onu kΔ±sa bir sΓΌre sonra (veya Γ§evrimdΔ±ΕΔ±ysa bir sonraki aΓ§Δ±lΔ±Εta) AppMint Push'a bildirir. Gerekenler: derleme yaparken Entegrasyon adΔ±mΔ±nda (AdΔ±m 3) AppMint Push aΓ§Δ±n. Bir kullanΔ±cΔ±ya gΓΆndermek, 30 EylΓΌl 2026'dan itibaren AppMint ile derlenen uygulamayΔ± Γ§alΔ±ΕtΔ±ran telefonlara ulaΕΔ±r; eski derlemeler yine de Herkese gΓΆnderilen mesajlarΔ± alΔ±r.

Oturum açtıktan sonra ve oturum kapatırken - veritabanı kimliğinizi kullanın, asla e-posta adresi veya telefon numarası kullanmayın:

function pushUser(id) {
  if (!(window.WebToApk && window.WebToApk.setPushUser)) return false;   // browser, or an older build
  return WebToApk.setPushUser(id);
}

async function signIn(email, password) {
  const user = await myBackend.signIn(email, password);   // your own sign-in
  pushUser(user.id);                                      // e.g. 'u_42' or a UUID
}

async function signOut() {
  await myBackend.signOut();
  pushUser('');                                           // this phone is nobody's now
}

Supabase: oturumu izleyin, böylece geri yüklenen bir oturum da yeni bir oturum açma gibi sayılır:

supabase.auth.onAuthStateChange(function (event, session) {
  if (!(window.WebToApk && window.WebToApk.setPushUser)) return;
  const id = session ? session.user.id : '';     // the auth UUID: letters, digits and '-'
  if (WebToApk.getPushUser() !== id) WebToApk.setPushUser(id);
});

Sizin kimliğiniz başka karakterler (boşluk, /, #) içerebiliyorsa kimliği kabul edilebilir hale getirin ve yine de reddedilen nadir durumu günlüğe kaydedin:

function pushUserIdFrom(rawId) {
  return String(rawId).trim().replace(/[^A-Za-z0-9_@.:+\-]/g, '_').slice(0, 128);
}

if (window.WebToApk && window.WebToApk.setPushUser) {
  const ok = WebToApk.setPushUser(pushUserIdFrom(currentUser.id));
  if (!ok) console.warn('push user id refused', currentUser.id);
}

Notlar: iki telefonda oturum açmış aynı kullanıcıya her ikisinden de ulaşılır. Kimlik hesaba değil bu kuruluma aittir; oturum kapatma onu temizlemelidir, yoksa telefon önceki kullanıcının mesajlarını almaya devam eder. setPushUser(''), setPushTag ile ayarlanan etiketleri temizlemez; kullanıcıya özel etiketleri de oturum kapatırken temizleyin.

trackEvent köprü#

window.WebToApk.trackEvent(name: String, propsJson: String): Boolean

Uygulama iΓ§i mesajlar: yaratΔ±cΔ±nΔ±n kampanyalarΔ±nΔ±n tetiklenebileceΔi bir olayΔ± bildirir ("event" tetikleyicisi, aynΔ± ad). propsJson isteΔe baΔlΔ± JSON'dur. {"path":"/x"} ile `appmint:route` adΔ±, URL'nin gΓΆstermediΔi bir gΓΆrΓΌnΓΌm deΔiΕikliΔini bildirir. [A-Za-z0-9_.:-]{1,64} dΔ±ΕΔ±ndaki bir ad iΓ§in ve AppMint Push olmadan False.

Örnek

Uygulamaya bir şeyin gerçekleştiğini bildirir ("signed_up", "checkout_done", "level:3"). Oluşturucunun AppMint Push gönderim merkezinde "Bir olay gerçekleştiğinde" tetikleyicisiyle ve aynı adla hazırladığı bir uygulama içi mesaj hemen (veya oluşturucunun seçtiği bekleme süresinden sonra) gösterilir.

DΓΆner deΔer: olay alΔ±ndΔ±ysa true; harf, rakam ve _ . : - (en fazla 64) dΔ±ΕΔ±nda bir ad iΓ§in ve AppMint Push olmadan derlenmiΕ bir uygulamada false. AppMint.trackEvent(name, props) aynΔ± Γ§aΔrΔ±dΔ±r, props bir nesne olarak. Gerekenler: derleme yaparken Entegrasyon adΔ±mΔ±nda (AdΔ±m 3) AppMint Push aΓ§Δ±k olmalΔ±. propsJson isteΔe baΔlΔ±dΔ±r ('') ve saklanmaz.

// After a purchase: the creator's "Thanks, rate us?" message is set to trigger on "purchase_done".
function onPurchaseDone(order) {
  if (window.AppMint && AppMint.trackEvent) {
    AppMint.trackEvent('purchase_done', { total: order.total });
  }
}

Ham köprü özellikleri JSON metni olarak alır (hiç yoksa '' gönderin):

function track(name, props) {
  if (!(window.WebToApk && window.WebToApk.trackEvent)) return false;   // a browser: nothing to show
  return WebToApk.trackEvent(name, props ? JSON.stringify(props) : '');
}
track('level:3');
track('tutorial_skipped', { step: 2 });

Adresin göstermediği bir ekran değişikliği (sekmeler, bir sihirbaz, bir modal "sayfa") rota olarak bildirilebilir; böylece oluşturucunun "Bir sayfada" mesajları onu görür. Sayfa ayrıca yolla birlikte appmint:route olayını gönderebilir; uygulama onu dinler:

function showTab(name) {
  document.querySelectorAll('.tab').forEach(function (t) { t.hidden = t.id !== name; });
  if (window.AppMint && AppMint.trackEvent) AppMint.trackEvent('appmint:route', { path: '/' + name });
}

// Same thing, without touching the bridge at all:
window.dispatchEvent(new CustomEvent('appmint:route', { detail: { path: '/cart' } }));

Notlar: rota mesajları gerçek URL değişikliklerini (sayfa yüklemeleri, history.pushState, #/hash rotaları) zaten kendiliğinden izler; yalnızca adresin değişmediği görünümler için rota bildirin. Olaylar hiçbir yerde sayılmaz veya saklanmaz; yalnızca bir mesajın gösterilip gösterilmeyeceğine karar verir.

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.