Buat APK Gratis

API jembatan JavaScript

Kotak masuk push dan audiens

Pesan yang dikirim pembuat aplikasi dari dasbor, disimpan di perangkat agar halaman bisa menampilkan riwayat, bukan hanya pop-up di baki - serta ID pengguna yang masuk dan tag yang memungkinkan pusat pengiriman menargetkan satu pengguna atau satu tag, dan menjalankan otomatisasi seperti pengingat keranjang yang ditinggalkan.

AppMint.trackEvent helper#

window.AppMint.trackEvent

Contoh

Didokumentasikan bersama WebToApk.trackEvent - contoh di sana menunjukkan yang ini juga.

Memberi tahu aplikasi bahwa sesuatu terjadi ("signed_up", "checkout_done", "level:3"). Pesan dalam aplikasi yang dibuat pembuat aplikasi di pusat pengiriman AppMint Push dengan pemicu "Saat suatu peristiwa terjadi" dan nama yang sama akan tampil sekarang (atau setelah jeda yang dipilih pembuat).

Mengembalikan: true bila event diterima; false untuk nama di luar huruf, angka, dan _ . : - (hingga 64), dan di aplikasi yang dibuat tanpa AppMint Push. AppMint.trackEvent(name, props) adalah panggilan yang sama dengan props sebagai objek. Membutuhkan: AppMint Push diaktifkan di langkah Integrate (Langkah 3) saat Anda membuat build. propsJson bersifat opsional ('') dan tidak disimpan.

// 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 });
  }
}

Jembatan mentah menerima props sebagai string JSON (kirim '' jika tidak ada):

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

Perubahan layar yang tidak terlihat di alamat (tab, wizard, "halaman" modal) bisa dilaporkan sebagai rute, sehingga pesan "Di sebuah halaman" milik pembuat aplikasi melihatnya. Halaman juga bisa mengirim peristiwa appmint:route dengan path-nya; aplikasi mendengarkannya:

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' } }));

Catatan: pesan rute sudah mengikuti perubahan URL sungguhan (pemuatan halaman, rute history.pushState, #/hash) dengan sendirinya; laporkan rute hanya untuk tampilan yang tidak mengubah alamat. Peristiwa tidak dihitung atau disimpan di mana pun; hanya menentukan apakah pesan tampil.

clearPushInbox jembatan#

window.WebToApk.clearPushInbox(): Boolean

Mengosongkan kotak masuk push (baki dan riwayat server tidak disentuh).

Contoh

Mengosongkan kotak masuk push di ponsel ini.

Mengembalikan: true saat selesai; false saat terjadi kesalahan internal. Memerlukan: aktifkan AppMint Push di langkah Integrasi (Langkah 3) saat Anda membuat aplikasi.

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();
});

Kosongkan kotak masuk saat pengguna keluar, agar orang berikutnya di ponsel ini tidak melihat pesan mereka:

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

Tampilkan baris pengaturan dengan jumlah pesan tersimpan, dinonaktifkan bila tidak ada yang bisa dihapus:

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

Catatan: ini permanen - tidak seperti dismissPushMessage, tidak ada batalkan. Notifikasi tray dan riwayat pengiriman Anda di AppMint tidak tersentuh. Pesan baru tetap tiba.

dismissPushMessage jembatan#

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

Menutup SATU pesan dari kotak masuk - gesekan per baris yang dibutuhkan layar kotak masuk (clearPushInbox bersifat semua-atau-tidak-sama-sekali). DAPAT DIBATALKAN secara desain: entri disembunyikan, bukan dihancurkan, sehingga UI bisa menawarkan "Urungkan" selama beberapa detik setelah gesekan. Hanya lokal: notifikasi di baki dan riwayat pembuat aplikasi tidak disentuh.

Contoh

Menyembunyikan satu pesan dari kotak masuk push (dengan menggesernya). Bisa dibatalkan dengan restorePushMessage(id).

Mengembalikan: true bila pesan disembunyikan; false bila id tidak dikenal atau sudah disembunyikan. Membutuhkan: aktifkan AppMint Push di langkah Integrate (Langkah 3) saat Anda membuat build.

Geser untuk menutup dengan Urungkan 5 detik:

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();
  };
}

Rapikan kotak masuk saat dibuka dengan menyembunyikan pesan yang sudah dibaca dan lebih tua dari 30 hari:

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

Tutup satu baris dengan gesekan jari sungguhan (seret lebih dari 40% lebar baris):

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

Catatan: hanya kotak masuk ponsel ini yang berubah. Notifikasi di baki dan riwayat pengiriman Anda di AppMint tetap ada. Pesan yang disembunyikan tidak dikembalikan oleh getPushInbox().

getInAppCampaigns jembatan#

window.WebToApk.getInAppCampaigns(): String

Pesan dalam aplikasi yang dipegang pemasangan ini: JSON [{id, name}] ("[]" tanpa AppMint Push).

Contoh

Mencantumkan pesan dalam aplikasi yang dimiliki instalasi ini saat ini (kampanye pembuat dari pusat pengiriman AppMint Push yang audiensnya mencakup pengguna ini) sebagai string JSON [{"id": "...", "name": "..."}].

Mengembalikan: string array JSON; "[]" bila tidak ada dan di aplikasi yang dibuat tanpa AppMint Push. Membutuhkan: AppMint Push diaktifkan di langkah Integrate (Langkah 3) saat Anda membuat build. Daftar disegarkan pada setiap aplikasi dimulai (dan sekitar setiap jam saat di latar depan).

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

Tampilkan daftar debug di layar admin Anda sendiri:

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

Lewati petunjuk sambutan Anda sendiri jika pembuat aplikasi sudah menjalankan pesan dengan nama tersebut:

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

Catatan: hanya id dan nama yang diekspos; pesan itu sendiri sampai ke halaman lewat event appmint:inapp saat ditampilkan (lihat setInAppPresentation).

getPushInbox jembatan#

window.WebToApk.getPushInbox(): String

Kotak masuk AppMint Push (pesan kiriman pembuat, terbaru lebih dulu, maksimal 50): array JSON dari {id, title, body, imageUrl, link, receivedAt, read}. Selalu kebenaran terkini yang lengkap - aplikasi yang terpasang terlambat tidak kehilangan apa pun karena melewatkan event `appmint:push` langsung.

Contoh

Membaca kotak masuk dalam aplikasi untuk pesan push yang Anda kirim dengan AppMint Push: terbaru dulu, hingga 50, tanpa yang sudah ditutup pengguna.

Mengembalikan: sebuah string JSON, secara sinkron. Parse. Setiap item: { id, title, body, imageUrl, link, receivedAt, read } (receivedAt dalam epoch ms; imageUrl dan link adalah '' bila pesan tidak memilikinya), ditambah field desain opsional bila Anda memakai template di AppMint: template, accent, iconUrl, buttons: [{label, link}], badge, inapp, countdownAt, progress, lines, collapse. '[]' bila kosong. Membutuhkan: aktifkan AppMint Push di langkah Integrate (Langkah 3) saat Anda membuat build; tanpa itu kotak masuk selalu kosong.

Tampilkan kotak masuk, dan segarkan secara langsung dengan appmint:push:

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

Perbarui jumlah belum dibaca pada lonceng Anda setiap kali pengguna kembali ke aplikasi (pesan yang tiba saat aplikasi di latar belakang sudah ada di kotak masuk):

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

Tampilkan gambar pesan dan tombolnya (hanya jika Anda merancangnya dengan itu), beserta waktu pesan tiba:

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

Catatan: kotak masuk disimpan di ponsel, jadi baca saat layar Anda terbuka - peristiwa hanya datang selama aplikasi tampil di layar. Pesan yang Anda tarik kembali dari AppMint akan hilang dari kotak masuk dan baki. Pesan yang dikirim sebagai "hanya push" (baki) tidak ditambahkan ke kotak masuk. Detail yang sama juga diteruskan ke window.onAppMintPush(detail) jika Anda mendefinisikannya.

getPushTags jembatan#

window.WebToApk.getPushTags(): String

Tag pemasangan ini sebagai string objek JSON, mis. {"plan":"pro"}.

Contoh

Membaca tag AppMint Push instalasi ini.

Mengembalikan: sebuah string JSON, secara sinkron - objek berisi nilai teks, mis. '{"plan":"pro","cart":"open"}'; '{}' jika tidak ada. Parse hasilnya. Memerlukan: aktifkan AppMint Push di langkah Integrasi (Langkah 3) saat Anda membuat aplikasi.

Baca satu tag:

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

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

Atur tag hanya saat berubah - setiap panggilan setPushTag membuat instalasi menghubungi AppMint Push, jadi lewati yang tidak mengubah apa pun:

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

Cantumkan di layar debug saat Anda menguji pengiriman ke sebuah tag:

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';
}

Catatan: ini adalah apa yang dipegang ponsel; pusat pengiriman melihatnya setelah check-in berikutnya dari pemasangan, beberapa detik setelah perubahan jika ponsel online.

getPushUser jembatan#

window.WebToApk.getPushUser(): String

ID pengguna yang terakhir ditetapkan dengan setPushUser ("" saat keluar atau belum pernah ditetapkan).

Contoh

Membaca ID pengguna yang terakhir diberikan instalasi ini ke AppMint Push dengan setPushUser.

Mengembalikan: sebuah string, secara sinkron - ID yang tersimpan, atau '' saat tidak ada yang masuk atau belum pernah ditetapkan. Memerlukan: aktifkan AppMint Push di langkah Integrasi (Langkah 3) saat Anda membuat aplikasi.

Tetapkan ID hanya saat berubah (di setiap aplikasi dimulai):

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

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

Hapus ID usang saat sesi Anda sendiri kedaluwarsa ketika aplikasi sedang tertutup:

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

Tampilkan di layar debug saat Anda menguji pengiriman ke satu pengguna:

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';
}

Catatan: ini adalah apa yang dipegang ponsel. Pusat pengiriman melihat perubahan setelah check-in berikutnya dari pemasangan, beberapa detik kemudian jika ponsel online.

markPushRead jembatan#

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

Menandai satu pesan push sebagai sudah dibaca; kirim "" untuk menandai semua pesan sudah dibaca.

Contoh

Menandai satu pesan kotak masuk push sebagai dibaca, atau semuanya bila Anda memberikan ''.

Mengembalikan: true bila sebuah pesan berubah; false bila tidak ada yang berubah (id tidak dikenal, sudah dibaca, atau AppMint Push tidak diaktifkan). Membutuhkan: aktifkan AppMint Push di langkah Integrate (Langkah 3) saat Anda membuat build.

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) : '';
}

Tandai pesan sebagai dibaca setelah pengguna benar-benar melihatnya di layar, bukan hanya saat mengetuknya:

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

Hapus lencana saat layar kotak masuk terbuka, dan gambar ulang hanya jika memang ada yang belum dibaca:

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();
  }
}

Catatan: status dibaca hanya disimpan di ponsel ini. Ini tidak menghapus notifikasi di baki.

restorePushMessage jembatan#

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

Batalkan dismiss: mengembalikan pesan ke tempatnya di kotak masuk.

Contoh

Membatalkan dismissPushMessage(id): pesan kembali ke kotak masuk push di tempat lamanya.

Mengembalikan: true jika pesan dipulihkan; false jika ID tidak dikenal atau pesan tidak disembunyikan. Memerlukan: aktifkan AppMint Push di langkah Integrasi (Langkah 3) saat Anda membuat aplikasi.

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

Batalkan beberapa gesekan sekaligus: ingat setiap pesan yang disembunyikan di layar ini dan kembalikan semuanya:

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();
});

Tawarkan daftar "Baru disembunyikan" yang bisa dipulihkan pengguna nanti. getPushInbox() tidak mengembalikan pesan yang disembunyikan, jadi simpan sendiri ID dan judulnya:

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

Catatan: pesan yang dihapus dengan clearPushInbox() atau ditarik kembali oleh Anda dari AppMint tidak dapat dipulihkan.

setInAppPresentation jembatan#

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

Penyajian pesan dalam aplikasi: "auto" (default) membiarkan shell menggambar desain pembuat; "none" (disimpan) menyerahkan setiap pesan ke halaman sebagai `appmint:inapp` {type:'shown', presented:false, message} untuk digambar sendiri.

Contoh

Memilih siapa yang menggambar pesan dalam aplikasi (kampanye dari pusat pengiriman AppMint Push) saat pemicunya terjadi: aplikasi ('auto', bawaan: desain banner, kartu tengah, bottom sheet, atau layar penuh dari pembuat aplikasi) atau halaman Anda sendiri ('none').

Mengembalikan: true bila mode disimpan (tetap di ponsel sampai diubah); false untuk nilai lain dan di aplikasi yang dibuat tanpa AppMint Push. Membutuhkan: AppMint Push diaktifkan di langkah Integrate (Langkah 3) saat Anda membuat build.

Setiap pesan dalam aplikasi memicu peristiwa appmint:inapp (dan memanggil window.onAppMintInApp(detail) jika Anda mendefinisikannya) dengan type 'shown', 'clicked', 'dismissed' atau 'answered' (jawaban berupa bintang atau skor 0-10, dengan question dan 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);
});

Gambar pesan sendiri; aplikasi menyerahkan setiap pesan alih-alih menampilkannya:

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

Kembalikan pilihan ke aplikasi (misalnya dari sakelar pengaturan):

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

Catatan: dengan 'none' pesan tetap dihitung sebagai ditampilkan (batas frekuensinya berlaku) begitu diserahkan ke halaman. Menetapkan 'none' juga menutup pesan yang sedang ditampilkan aplikasi. Pesan push punya sakelar sendiri, setPushPresentation.

setPushPresentation jembatan#

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

Tampilan pesan push dalam aplikasi secara native: "auto" (bawaan) membiarkan shell menggambar banner / modal / sheet / kartu layar penuh pilihan pembuat aplikasi selama aplikasi terbuka; "none" mematikannya selamanya (disimpan) - untuk aplikasi yang menggambar sendiri. Peristiwa `appmint:push` dan kotak masuk tidak terpengaruh dalam kedua kasus; flag `presented` pada peristiwa yang diterima menyatakan apakah shell menampilkannya.

Contoh

Menyalakan ('auto', default) atau mematikan ('none') tampilan pesan AppMint Push di layar oleh aplikasi sendiri - untuk aplikasi yang menggambar bannernya sendiri dari event appmint:push.

Mengembalikan: true saat mode tersimpan; false untuk nilai selain 'auto' atau 'none'. Pilihan disimpan di ponsel dan bertahan hingga diubah. Memerlukan: aktifkan AppMint Push di langkah Integrasi (Langkah 3) saat Anda membuat aplikasi.

Gambar banner Anda sendiri alih-alih milik shell:

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

Biarkan pengguna mematikan pop-up di layar pengaturan Anda. Tidak ada getter, jadi simpan salinan pilihan itu sendiri untuk menggambar sakelarnya:

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) {}
  }
});

Dengan 'auto', cari tahu apa yang dilakukan pengguna pada pesan yang ditampilkan aplikasi di layar: opened saat mereka mengetuknya (action adalah -1 untuk pesan itu sendiri, selain itu indeks tombol), closed saat mereka menutupnya tanpa mengetuk:

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

Catatan: dengan 'auto', pesan yang Anda kirim dengan gaya dalam aplikasi ditampilkan di atas aplikasi selama aplikasi terbuka (dan tidak juga dimasukkan ke baki). Dengan 'none' shell tidak pernah menggambarnya; kotak masuk (getPushInbox) dan peristiwa appmint:push bekerja sama dalam kedua kasus. Menetapkan 'none' juga menutup pesan yang sedang ditampilkan shell.

setPushTag jembatan#

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

Menetapkan satu tag AppMint Push (kunci: huruf, angka, _ hingga 32; nilai hingga 128) - pusat pengiriman bisa menargetkan "plan = pro", dan otomatisasi bisa berjalan setelah jeda waktu tertentu sejak tag ditetapkan (keranjang yang ditinggalkan: tetapkan cart=open, hapus saat checkout). Nilai kosong menghapus tag. Hingga 50 tag per pemasangan.

Contoh

Mengatur satu tag AppMint Push pada instalasi ini, seperti plan = pro atau city = pune. Pusat pengiriman (Home > Notifications) dapat mengirim ke semua yang memiliki tag, dan otomasi tag dapat mengirim pesan beberapa waktu setelah tag diatur - keranjang yang ditinggalkan, level yang selesai. Nilai kosong menghapus tag.

Mengembalikan: true saat tersimpan; false saat kunci bukan 1-32 huruf, angka atau _, nilai lebih panjang dari 128 karakter, atau pemasangan akan memiliki lebih dari 50 tag (tidak ada yang disimpan dalam kasus itu). Tag disimpan di ponsel dan dilaporkan ke AppMint Push sesaat kemudian (atau saat peluncuran berikutnya jika offline). Memerlukan: aktifkan AppMint Push di langkah Integrasi (Langkah 3) saat Anda membuat aplikasi. Penargetan tag dan otomatisasi menjangkau ponsel yang menjalankan aplikasi buatan AppMint mulai 30 Sep 2026.

Beri tag pada apa yang dibeli atau dipilih pengguna, agar Anda bisa mengirim hanya ke "plan = pro":

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

Keranjang yang ditinggalkan: tetapkan tag saat ada barang di keranjang dan hapus saat checkout. Di pusat pengiriman, tambahkan otomatisasi tag pada cart dengan jeda (misalnya 60 menit); ponsel hanya mendapat pengingat jika cart masih tertetapkan saat waktunya tiba:

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
}

Hapus tag khusus pengguna saat keluar, bersama id pengguna:

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

Catatan: tag milik pemasangan ini, bukan pengguna yang masuk. Menetapkan tag ke nilai yang sudah dimilikinya tidak mengubah apa pun di server. Setelah tag dihapus, menetapkannya lagi memungkinkan otomatisasi tag mengirim sekali lagi. Jangan pernah memasukkan alamat email, nomor telepon, atau hal pribadi apa pun ke dalam tag.

setPushTags jembatan#

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

Mengatur beberapa tag sekaligus dari string objek JSON; nilai "" menghapus.

Contoh

Menetapkan beberapa tag AppMint Push sekaligus dari string objek JSON, mis. '{"plan":"pro","team":"red"}'. Nilai "" menghapus tag itu; tag yang tidak Anda sebut tetap dipertahankan.

Mengembalikan: true saat tersimpan; false saat string bukan objek JSON, ada kunci yang bukan 1-32 huruf, angka atau _, ada nilai yang lebih panjang dari 128 karakter, atau pemasangan akan memiliki lebih dari 50 tag - maka tidak ada yang tersimpan sama sekali. Memerlukan: aktifkan AppMint Push di langkah Integrasi (Langkah 3) saat Anda membuat aplikasi. Penargetan tag dan otomatisasi menjangkau ponsel yang menjalankan aplikasi buatan AppMint mulai 30 Sep 2026.

Setelah masuk, beri tag pada profil dalam satu panggilan:

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

Saat keluar, hapus semuanya (baca tag saat ini, kirim kembali masing-masing sebagai ''):

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('');
}

Menyelesaikan level: beri tag, dan biarkan otomatisasi tag pada level_done (misalnya 10 menit) mengirim tantangan berikutnya:

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

Catatan: satu panggilan adalah satu perubahan: semuanya tersimpan atau tidak sama sekali. Pemasangan melaporkan tag baru ke AppMint Push sesaat kemudian (atau saat peluncuran berikutnya jika offline).

setPushUser jembatan#

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

Audiens AppMint Push: memberi tahu pusat pengiriman pembuat aplikasi SIAPA pemilik pemasangan ini, sehingga pesan bisa dikirim ke satu pengguna yang sedang masuk ("u_42") atau ke semua yang memiliki suatu tag. Panggil setelah masuk dengan ID akun tetap milik Anda sendiri; kirim "" saat keluar. Huruf, angka, dan _ @ . : + - (hingga 128). Mengembalikan false untuk selain itu, dan pada aplikasi yang tidak memakai AppMint Push (OneSignal / Firebase sendiri: tidak ada yang dikirim, 2026-10-03). Jangan pernah mengirim alamat email atau nomor telepon - gunakan ID database Anda.

Contoh

Memberi tahu AppMint Push pengguna ANDA yang mana yang sedang masuk di ponsel ini, sehingga pusat pengiriman (Beranda > Notifikasi) bisa mengirim pesan ke pengguna itu saja. Panggil setelah masuk dengan ID akun tetap milik Anda sendiri; panggil dengan '' saat keluar.

Mengembalikan: true bila id disimpan; false untuk id dengan karakter selain huruf, angka, dan _ @ . : + -, atau lebih dari 128 karakter (tidak ada yang disimpan). Id disimpan di ponsel sampai Anda mengubahnya, dan instalasi ini melaporkannya ke AppMint Push sesaat kemudian (atau pada peluncuran berikutnya bila offline). Membutuhkan: aktifkan AppMint Push di langkah Integrate (Langkah 3) saat Anda membuat build. Pengiriman ke pengguna menjangkau ponsel yang menjalankan aplikasi yang dibuat dengan AppMint mulai 30 Sep 2026; build lama tetap menerima pesan yang dikirim ke Everyone.

Setelah masuk dan saat keluar - gunakan ID database Anda, jangan pernah alamat email atau nomor telepon:

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: ikuti sesi, sehingga sesi yang dipulihkan dihitung seperti masuk baru:

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

Buat ID dapat diterima jika ID Anda mungkin berisi karakter lain (spasi, /, #), dan catat yang jarang tetap ditolak:

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

Catatan: pengguna yang sama yang masuk di dua ponsel akan dijangkau di keduanya. ID milik pemasangan ini, bukan milik akun - saat keluar ID harus dihapus, atau ponsel terus menerima pesan pengguna sebelumnya. setPushUser('') tidak menghapus tag yang ditetapkan dengan setPushTag; hapus juga tag khusus pengguna saat keluar.

trackEvent jembatan#

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

Pesan dalam aplikasi: melaporkan event yang dapat memicu kampanye pembuat (pemicu "event", nama yang sama). propsJson bersifat opsional JSON. Nama `appmint:route` dengan {"path":"/x"} melaporkan perubahan tampilan yang tidak terlihat di URL. False untuk nama di luar [A-Za-z0-9_.:-]{1,64}, dan tanpa AppMint Push.

Contoh

Memberi tahu aplikasi bahwa sesuatu terjadi ("signed_up", "checkout_done", "level:3"). Pesan dalam aplikasi yang dibuat pembuat aplikasi di pusat pengiriman AppMint Push dengan pemicu "Saat suatu peristiwa terjadi" dan nama yang sama akan tampil sekarang (atau setelah jeda yang dipilih pembuat).

Mengembalikan: true bila event diterima; false untuk nama di luar huruf, angka, dan _ . : - (hingga 64), dan di aplikasi yang dibuat tanpa AppMint Push. AppMint.trackEvent(name, props) adalah panggilan yang sama dengan props sebagai objek. Membutuhkan: AppMint Push diaktifkan di langkah Integrate (Langkah 3) saat Anda membuat build. propsJson bersifat opsional ('') dan tidak disimpan.

// 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 });
  }
}

Jembatan mentah menerima props sebagai string JSON (kirim '' jika tidak ada):

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

Perubahan layar yang tidak terlihat di alamat (tab, wizard, "halaman" modal) bisa dilaporkan sebagai rute, sehingga pesan "Di sebuah halaman" milik pembuat aplikasi melihatnya. Halaman juga bisa mengirim peristiwa appmint:route dengan path-nya; aplikasi mendengarkannya:

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' } }));

Catatan: pesan rute sudah mengikuti perubahan URL sungguhan (pemuatan halaman, rute history.pushState, #/hash) dengan sendirinya; laporkan rute hanya untuk tampilan yang tidak mengubah alamat. Peristiwa tidak dihitung atau disimpan di mana pun; hanya menentukan apakah pesan tampil.

Dibuat dari runtime aplikasi dan file contohnya pada setiap build dokumentasi. Baca sebagai Markdown · Semua keluarga.

Diperiksa terhadap jembatan yang dirilis pada 2026-10-22.