Buat APK Gratis

API jembatan JavaScript

Peluncuran, pintasan, dan tombol kembali

Cara aplikasi dibuka, pintasan tekan-lama pada ikon, permintaan ulasan dalam aplikasi, dan memberi tahu shell bahwa halaman menginginkan tombol kembali.

AppMint.requestReview helper#

AppMint.requestReview(options)

Contoh

Meminta Google Play menampilkan lembar penilaiannya sendiri di dalam aplikasi (Play In-App Review) dan memberi tahu Anda apa yang terjadi.

Mengembalikan: sebuah Promise yang selalu terselesaikan {result, openedStore, message?}. result adalah 'shown' (Play menampilkan lembarannya - Play tidak pernah memberi tahu apakah pengguna memberi nilai), 'not_from_play' (instalasi ini bukan dari Google Play: APK yang dipasang manual atau instalasi uji coba, tempat Play tidak pernah menampilkan lembaran), 'quota' (Play memilih tidak menampilkannya sekarang: kuotanya untuk pengguna ini, atau mereka sudah memberi ulasan) atau 'error' (Play tidak dapat ditanyai: tidak ada Play Store, offline). Dengan {openStore: true}, halaman Play aplikasi terbuka saat lembaran tidak muncul, dan openedStore bernilai true. Membutuhkan: tidak ada yang perlu diaktifkan.

Kode apa pun:

// A "Rate us" button: the sheet when Play shows it, the Play listing otherwise.
document.getElementById('rate-btn').onclick = async function () {
  if (!(window.AppMint && AppMint.requestReview)) { location.href = 'https://play.google.com/store/apps/details?id=com.example.app'; return; }
  var r = await AppMint.requestReview({ openStore: true });
  if (r.result === 'shown' || r.openedStore) showToast('Thank you!');
};

Tanyakan setelah momen sukses alih-alih dari tombol, tanpa pernah meninggalkan aplikasi:

async function onOrderDelivered(count) {
  if (count !== 3 || !(window.AppMint && AppMint.requestReview)) return;
  var r = await AppMint.requestReview();      // no openStore: nothing opens if Play says no
  if (r.result === 'not_from_play') console.log('Test install: Play only shows the sheet for Play installs');
}

Saat pembuat mengaktifkan Ask users to rate the app (langkah Tampilan), aplikasi bertanya sendiri pada momen yang tenang dan memberi tahu halaman apa yang terjadi:

window.addEventListener('appmint:review', function (e) {
  // e.detail = { result, openedStore: false, source: 'auto' }
  analytics.track('rate_prompt', { result: e.detail.result });
});

Catatan: Google Play membatasi frekuensi lembar ini dan memutuskan sendiri apakah ia muncul; jangan pernah memberi imbalan untuk ulasan atau menjanjikan lembar itu pada sebuah tombol. Ujilah dengan instalasi dari jalur pengujian internal Play - APK hasil sideload selalu menjawab not_from_play.

Tanpa kode: tautan appmint://review. Tombol atau tautan dengan alamat ini meminta lembar yang sama (dan membuka halaman Play saat Play tidak akan menampilkannya, karena pengguna memang meminta untuk menilai). Dalam pesan dalam aplikasi, taruh di tombol di pusat pengiriman (templat Rate us melakukannya); di halaman, pakai sebagai tautan biasa:

<a href="appmint://review" class="rate-link">Rate us on Google Play</a>

Dari skrip, misalnya setelah pesanan ketiga selesai:

function maybeAskForRating(ordersDone) {
  if (ordersDone === 3) location.href = 'appmint://review';   // the app runs it; nothing is loaded
}

Dengarkan apa yang dipilih pengguna dalam pesan dalam aplikasi "Nilai kami" sebelum lembar terbuka:

window.addEventListener('appmint:inapp', function (e) {
  var d = e.detail;
  if (d.type === 'answered' && d.question === 'stars' && d.value <= 3) showFeedbackForm();
  if (d.type === 'clicked' && d.link === 'appmint://review') console.log('Opening the Play review sheet');
});

AppMint.setBackHandler helper#

AppMint.setBackHandler(handler)

Contoh

Memberi halaman Anda hak bicara pertama saat pengguna menekan tombol Kembali ponsel (atau memakai gestur kembali). Dibutuhkan oleh aplikasi yang mengganti layar dengan menampilkan dan menyembunyikan elemen, di mana riwayat Android kosong dan Kembali akan keluar dari aplikasi.

Mengembalikan: tidak ada. handler Anda harus mengembalikan true (sudah ditangani, tetap di sini) atau false (biarkan aplikasi kembali / keluar). Membutuhkan: tidak ada. Dipasang saat dokumen dimulai, jadi Anda bisa mendaftarkannya di skrip pertama Anda.

if (window.AppMint && AppMint.setBackHandler) {
  AppMint.setBackHandler(function () {
    if (isMenuOpen)               { closeMenu();  return true; }   // consumed
    if (currentScreen !== 'home') { goTo('home'); return true; }
    return false;   // nothing to undo: normal Back (history back, exit dialog, exit)
  });
}

// Remove it again, for example when the screen that needed it closes:
// AppMint.setBackHandler(null);

Event appmint:back - bisa dibatalkan. Panggil e.preventDefault() untuk menghabiskan penekanan itu. Ini berjalan sebelum penangan, dan sejumlah listener bisa memakainya:

window.addEventListener('appmint:back', function (e) {
  var sheet = document.querySelector('.bottom-sheet.open');
  if (sheet) {
    sheet.classList.remove('open');
    e.preventDefault();   // consumed: the handler and the shell do nothing more
  }
});

Cegah catatan setengah jadi hilang: Kembali menampilkan bilah "Buang perubahan?" Anda sendiri alih-alih keluar (confirm() yang memblokir akan melewatkan jendela jawaban 350 ms, sehingga shell akan kembali juga):

if (window.AppMint && AppMint.setBackHandler) {
  var noteDirty = false;
  document.getElementById('note').addEventListener('input', function () { noteDirty = true; });

  AppMint.setBackHandler(function () {
    if (!noteDirty) return false;        // nothing to lose: normal Back
    showDiscardBar();                    // your in-page "Discard changes? / Keep editing" bar
    return true;                         // stay here while the user decides
  });

  document.getElementById('discard-btn').onclick = function () {
    noteDirty = false;                   // the next Back press passes straight through
    hideDiscardBar();
    closeEditor();
  };
}

Catatan: Jawabannya harus sinkron: mengembalikan Promise dihitung sebagai "tidak ditangani". Jawab dengan cepat - jika halaman tidak menjawab dalam sekitar 350 ms, shell kembali dengan sendirinya. Urutan pada setiap penekanan: menu samping yang terbuka (drawer aplikasi sendiri) ditutup lebih dulu dan halaman tidak ditanya; lalu listener appmint:back → penangan Anda → penutup dialog bawaan shell (menutup <dialog> yang terbuka, dialog ARIA, atau modal layar penuh) → kembali di riwayat / konfirmasi keluar / keluar. Aplikasi yang memakai history.pushState untuk setiap layar (React Router dan sejenisnya) tidak membutuhkan ini. Aplikasi buatan AI bisa memakai onBackGesture dari @/lib/appmintNative.

__pullRefreshEligible jembatan#

window.WebToApk.__pullRefreshEligible(eligible: Boolean)

Lihat [pullPageEligible] / [pullProbeJs]. Dipanggil pada setiap touchstart.

Contoh

Saluran internal di balik pull-to-refresh: probe sentuh milik shell memanggilnya pada setiap sentuhan untuk menentukan apakah tarikan ke bawah di sana harus menyegarkan halaman. Halaman tidak pernah memanggilnya - halaman mengendalikan pull-to-refresh dengan CSS dan event sentuh standar.

Mengembalikan: tidak ada. Membutuhkan: Enable Pull-to-Refresh diaktifkan di Langkah 3 (Integrasi), di bawah Display Options, saat Anda membuat build (tanpanya probe tidak dipasang).

Cara publik untuk menghentikan tarik-untuk-muat-ulang di sebagian halaman Anda - klaim gestur tersebut:

<style>
  /* A map, drawing canvas or slider: this element owns vertical drags. */
  #map, #canvas { touch-action: none; }
  /* A horizontal carousel: pan-x also tells the shell "not a refresh". */
  .carousel { touch-action: pan-x; }
</style>

Atau klaim dari penangan sentuh, cara standar:

document.getElementById('canvas').addEventListener('touchstart', function (e) {
  e.preventDefault();   // the page took this gesture: no pull-to-refresh
}, { passive: false });

Cegah permukaan geser-dan-zoom menyegarkan halaman dengan mengklaim seretan vertikal hanya lewat CSS:

<div id="board" style="touch-action: none; height: 60vh"></div>
<script>
  // Dragging on #board moves the board; a pull from the top of the rest of the page still refreshes.
  document.getElementById('board').addEventListener('pointermove', function (e) { moveBoard(e); });
</script>

Catatan: Tarikan hanya menyegarkan saat kotak yang bisa di-scroll terdekat di bawah jari (atau halaman itu sendiri) berada di paling atas, hanya satu jari yang menyentuh, dan tidak ada klaim di atas yang berlaku. Sentuhan di dalam iframe lintas-origin tidak pernah menyegarkan. Jangan panggil metode ini sendiri.

getAppIcon jembatan#

window.WebToApk.getAppIcon(): String

Ikon launcher yang dipakai: "default" atau salah satu nama dari getAvailableIcons().

Contoh

Ikon launcher yang dipakai: 'default' atau salah satu nama dari getAvailableIcons().

Mengembalikan: string. 'default' pada build tanpa ikon alternatif.

if (window.WebToApk && WebToApk.getAppIcon) {
  const current = WebToApk.getAppIcon();          // 'default', 'Dark', …
  document.querySelectorAll('[data-icon]').forEach(el => {
    el.classList.toggle('selected', el.dataset.icon === current);
  });
}

Beralih ke ikon berikutnya dari layar pengaturan:

function nextIcon() {
  if (!(window.WebToApk && WebToApk.getAvailableIcons && WebToApk.setAppIcon)) return;
  const names = JSON.parse(WebToApk.getAvailableIcons());
  if (names.length < 2) return;                                  // no alternate icons in this build
  const next = names[(names.indexOf(WebToApk.getAppIcon()) + 1) % names.length];
  if (!WebToApk.setAppIcon(next)) alert('Could not change the icon.');
}

Tampilkan nama ikon dalam label, atau sembunyikan di luar aplikasi:

const label = document.getElementById('icon-label');
if (window.WebToApk && WebToApk.getAppIcon) {
  const name = WebToApk.getAppIcon();
  label.textContent = name === 'default' ? 'Classic icon' : name + ' icon';
} else {
  label.hidden = true;           // in a browser there is no launcher icon
}

getAvailableIcons jembatan#

window.WebToApk.getAvailableIcons(): String

Array JSON nama ikon yang diterima setAppIcon: "default" lebih dulu, lalu ikon alternatif dari build.

Contoh

Nama ikon yang diterima setAppIcon, sebagai string array JSON: 'default' lebih dulu, lalu ikon alternatif dari wizard build sesuai urutan Anda menambahkannya.

Mengembalikan: '["default","Dark","Gold"]', atau '["default"]' pada build tanpa ikon alternatif.

Buat pemilih ikon:

function iconPicker(container) {
  if (!(window.WebToApk && WebToApk.getAvailableIcons)) return;
  const names = JSON.parse(WebToApk.getAvailableIcons());
  if (names.length < 2) { container.hidden = true; return; }   // nothing to choose
  const current = WebToApk.getAppIcon();
  container.innerHTML = '';
  names.forEach(name => {
    const b = document.createElement('button');
    b.textContent = name === 'default' ? 'Classic' : name;
    b.className = name === current ? 'selected' : '';
    b.onclick = () => { if (WebToApk.setAppIcon(name)) iconPicker(container); };
    container.appendChild(b);
  });
}
iconPicker(document.querySelector('#iconPicker'));

Sembunyikan pemilih pada build tanpa ikon alternatif:

const picker = document.getElementById('iconPicker');
let names = ['default'];
if (window.WebToApk && WebToApk.getAvailableIcons) names = JSON.parse(WebToApk.getAvailableIcons());
picker.hidden = names.length < 2;      // only 'default' means there is nothing to choose

Ganti ikon sesuai tema:

function matchIconToTheme(dark) {
  if (!(window.WebToApk && WebToApk.getAvailableIcons && WebToApk.setAppIcon)) return;
  const names = JSON.parse(WebToApk.getAvailableIcons());
  const wanted = dark ? 'Dark' : 'default';
  if (names.includes(wanted) && WebToApk.getAppIcon() !== wanted) WebToApk.setAppIcon(wanted);
}
matchIconToTheme(matchMedia('(prefers-color-scheme: dark)').matches);

getLaunchUrl jembatan#

window.WebToApk.getLaunchUrl(): String

Tautan dalam yang meluncurkan atau melanjutkan aplikasi ini, atau "" jika dibuka secara normal. Baca setiap kali aplikasi Anda dimuat dan arahkan sendiri: const u = window.WebToApk?.getLaunchUrl?.(); if (u) router.navigate(new URL(u).pathname); Nilainya DISIMPAN, tidak dihabiskan, sehingga aplikasi yang dimuat belakangan tetap melihatnya; tautan berikutnya yang tiba saat aplikasi berjalan menggantikannya dan juga memicu 'appmint:deep-link'.

Contoh

Tautan dalam yang membuka (atau membuka kembali) aplikasi, sebagai string, atau "" saat aplikasi dibuka secara normal.

Mengembalikan: string, secara sinkron. Membutuhkan: tidak ada. Nilainya disimpan, tidak dihabiskan, jadi aman dibaca kapan pun aplikasi Anda dimuat.

Sebuah tautan bisa tiba dalam tiga bentuk: https://yoursite.com/path, appmint-shortcut://<package>/<route> milik shell sendiri (pintasan launcher, widget layar utama), atau skema kustom Anda myapp://segment/path. Helper ini mengubah ketiganya menjadi sebuah rute:

function routeOf(link) {
  var m = /^([a-z][a-z0-9+.-]*):\/\/([^\/?#]*)([^#]*)/i.exec(link || '');
  if (!m) return '/';
  var scheme = m[1].toLowerCase(), host = m[2], rest = m[3] || '';
  if (scheme === 'http' || scheme === 'https' || scheme === 'appmint-shortcut') return rest || '/';
  return '/' + host + rest;               // myapp://product/42 -> /product/42
}

// 1. On start: the link that launched the app.
if (window.WebToApk && typeof window.WebToApk.getLaunchUrl === 'function') {
  var link = window.WebToApk.getLaunchUrl();
  if (link) goTo(routeOf(link));
}

// 2. While running: a new link replaces the old one and fires 'appmint:deep-link'.
window.addEventListener('appmint:deep-link', function (e) {
  goTo(routeOf(e.detail.url));            // detail: { url }
});

Pengumuman yang sama juga diteruskan ke hook global, jika Anda lebih suka satu:

window.onAppMintDeepLink = function (detail) { goTo(routeOf(detail.url)); };

Baca kode referral dari tautan seperti https://yoursite.com/invite?code=AB12 atau myapp://invite?code=AB12, sekali per tautan (memakai routeOf dari atas):

function applyInvite(link) {
  if (!link) return;
  var done = '';
  try { done = sessionStorage.getItem('handledLink') || ''; } catch (e) {}
  if (link === done) return;                      // the same url is announced again after a reload
  try { sessionStorage.setItem('handledLink', link); } catch (e) {}
  var code = null;
  try { code = new URL(link).searchParams.get('code'); } catch (e) { return; }
  if (code && routeOf(link).indexOf('/invite') === 0) showInviteBanner(code);
}

if (window.WebToApk && typeof window.WebToApk.getLaunchUrl === 'function') {
  applyInvite(window.WebToApk.getLaunchUrl());
  window.addEventListener('appmint:deep-link', function (e) { applyInvite(e.detail.url); });
}

Catatan: appmint:deep-link juga dipicu setelah setiap pemuatan halaman selama tautan masih disimpan, sehingga url yang sama bisa tiba lebih dari sekali. Abaikan tautan yang sudah Anda tangani.

Aplikasi mode situs web berbeda: shell sendiri memuat tautan https:// yang masuk (saat start dingin dan saat berjalan), dan tautan skema kustom myapp://product/42 lebih dulu ditulis ulang ke alamat situs Anda (https://yoursite.com/product/42), jadi getLaunchUrl() mengembalikan bentuk https:// dan halaman Anda biasanya tidak perlu mengarahkan apa pun. Ketukan pintasan launcher atau widget membuka rutenya di situs Anda (/today memuat https://yoursite.com/today), dan getLaunchUrl() tetap mengembalikan bentuk appmint-shortcut:// (lihat setAppShortcuts). Di aplikasi HTML, ZIP, dan buatan AI (dilayani dari dalam aplikasi), shell tidak pernah bernavigasi: halaman Anda menerima tautannya dan mengarahkan sendiri. Tautan skema kustom tetap seperti saat tiba di sana, karena tidak ada alamat situs untuk dipetakan. Aplikasi buatan AI bisa memakai launchUrl() dari @/lib/appmintNative.

rateApp jembatan#

window.WebToApk.rateApp(): String

Membuka alur penilaian di halaman Play. `rateApp()` sudah ada tetapi hanya entri drawer native yang bisa menjangkaunya, sehingga aplikasi yang menggambar UI-nya sendiri - setiap build AI, di mana drawer mati - tidak punya cara untuk meminta penilaian. Ini adalah satu-satunya aksi toko yang benar-benar tidak bisa dilakukan sendiri oleh halaman: `market://` adalah intent, bukan URL yang bisa dinavigasi. Dikendalikan oleh sakelar "Rate App Button" milik pembuat sendiri, persis seperti entri drawer dan item Bagikan bottom-nav: mematikan Rate harus berarti tidak ada permukaan penilaian di mana pun, atau sakelarnya terlihat rusak.

Contoh

Membuka halaman Google Play aplikasi agar pengguna dapat memberinya nilai.

Mengembalikan: 'opened' saat halaman Play dibuka, 'off' saat pembuat mematikan Rate App (maka tidak terjadi apa-apa). Membutuhkan: sakelar Rate App Button di Langkah 5 (Menu) saat Anda membuat build (aktif secara bawaan; ini juga menambahkan item "Nilai Aplikasi" ke menu samping). Jika dimatikan, panggilan ini tidak melakukan apa-apa dan mengembalikan 'off'. Untuk lembar penilaian dalam aplikasi milik Google Play gunakan AppMint.requestReview().

var rateBtn = document.getElementById('rate-btn');
if (window.WebToApk && typeof window.WebToApk.rateApp === 'function') {
  rateBtn.onclick = function () { window.WebToApk.rateApp(); };
} else {
  rateBtn.hidden = true;   // in a browser
}

Tawarkan penilaian sekali, setelah pengguna menyelesaikan lima latihan, dari kartu yang mereka ketuk:

function maybeOfferRating(completedCount) {
  if (!window.WebToApk || typeof window.WebToApk.rateApp !== 'function') return;
  var asked = false;
  try { asked = localStorage.getItem('rateAsked') === '1'; } catch (e) {}
  if (asked || completedCount < 5) return;

  var card = document.getElementById('rate-card');   // "Enjoying the app? Rate it on Google Play"
  card.hidden = false;
  card.querySelector('.rate-yes').onclick = function () {
    window.WebToApk.rateApp();                         // opens the Play listing
    try { localStorage.setItem('rateAsked', '1'); } catch (e) {}
    card.hidden = true;
  };
  card.querySelector('.rate-later').onclick = function () { card.hidden = true; };
}

Baris "Nilai kami" di layar pengaturan Anda yang mengucapkan terima kasih saat pengguna kembali dari Google Play (kembalinya halaman ke latar depan adalah satu-satunya sinyal bahwa pengguna sudah kembali):

document.getElementById('settings-rate').onclick = function () {
  if (!window.WebToApk || typeof window.WebToApk.rateApp !== 'function') return;
  window.WebToApk.rateApp();
  document.addEventListener('visibilitychange', function onBack() {
    if (document.visibilityState !== 'visible') return;
    document.removeEventListener('visibilitychange', onBack);
    showToast('Thanks for taking a look!');           // your own toast; the user may not have rated
  });
};

Catatan: Ini membuka halaman Play Store (market://details?id=<package>), atau situs web Play bila aplikasi Play Store tidak ada. Ini bukan kartu ulasan dalam aplikasi. Halaman tidak dapat membuka market:// sendiri - itu adalah intent Android, bukan alamat web. Minta hanya setelah pengguna melakukan sesuatu yang mereka sukai, dan dari sebuah ketukan.

requestReview jembatan#

window.WebToApk.requestReview(optionsJson: String, callbackId: String)

Meminta Play untuk menampilkan lembar ulasannya; [optionsJson] `{openStore?}`. Menyelesaikan AppMint.requestReview [callbackId].

Contoh

Saluran internal di balik AppMint.requestReview() - halaman memakai helper Promise itu, yang meminta lembar ulasan dalam aplikasi dari Google Play dan selesai dengan apa yang terjadi.

Mengembalikan: tidak ada secara langsung; hasilnya menyelesaikan promise AppMint.requestReview(). Membutuhkan: tidak ada yang perlu diaktifkan. Lembar ini hanya muncul untuk aplikasi yang dipasang dari Google Play.

API publik:

async function askForRating() {
  if (!(window.AppMint && AppMint.requestReview)) return;          // a browser: no store here
  var r = await AppMint.requestReview();
  console.log(r.result);   // 'shown' | 'not_from_play' | 'quota' | 'error'
}

Tanyakan setelah momen yang baik, dan minta halaman toko saat lembar tidak muncul:

async function afterHappyMoment() {
  if (!(window.AppMint && AppMint.requestReview)) return;
  const r = await AppMint.requestReview({ openStore: true });   // {result, openedStore, message?}
  if (r.result === 'shown') thankUser();
  else if (r.openedStore) console.log('Opened the Play listing instead');
}

Dengarkan permintaan otomatis dan laporkan kesalahan:

window.addEventListener('appmint:review', (e) => {
  if (e.detail.source === 'auto') console.log('Rate prompt result:', e.detail.result);
});

AppMint.requestReview().then((r) => {
  if (r.result === 'error') console.warn(r.message);
  if (r.result === 'not_from_play') showMessage('Rating is available once the app is installed from Google Play.');
});

setAppIcon jembatan#

window.WebToApk.setAppIcon(name: String): Boolean

Mengubah ikon launcher aplikasi ke salah satu ikon alternatif yang ditambahkan di wizard build, dengan nama yang diberikan di sana ("default" = ikon normal). Mengembalikan false untuk nama yang tidak dimiliki build ini. Launcher menggambar ulang dengan waktunya sendiri (beberapa detik di sebagian ponsel), dan sebagian launcher menutup aplikasi atau memindahkan ikon layar utamanya saat berubah - beralihlah dari layar pengaturan, bukan di tengah sebuah tugas.

Contoh

Mengubah ikon launcher aplikasi ke salah satu ikon alternatif yang Anda tambahkan di wizard build (langkah Dasar, "Alternate app icons"), dengan nama yang Anda berikan di sana. 'default' adalah ikon normal Anda.

Mengembalikan: true saat peralihan dilakukan (atau sudah ikon itu), false untuk nama yang tidak dimiliki build ini. Membutuhkan: ikon alternatif yang ditambahkan di wizard (hingga 4). Sebagian launcher butuh beberapa detik untuk menggambar ulang ikon, dan sebagian menutup aplikasi atau memindahkan pintasan layar utamanya saat berubah: beralihlah dari layar pengaturan, bukan di tengah sebuah tugas. Pintasan launcher Anda (setAppShortcuts) diterbitkan ulang di bawah ikon baru secara otomatis.

function useIcon(name) {
  if (!(window.WebToApk && window.WebToApk.setAppIcon)) return false;
  const ok = WebToApk.setAppIcon(name);
  if (!ok) console.warn('no icon called', name);
  return ok;
}

document.querySelector('#darkIcon').addEventListener('click', () => useIcon('Dark'));
document.querySelector('#normalIcon').addEventListener('click', () => useIcon('default'));

Buat pemilih dari ikon yang dimiliki build ini:

if (window.WebToApk && WebToApk.getAvailableIcons) {
  const names = JSON.parse(WebToApk.getAvailableIcons());   // 'default' first, then your alternates
  const current = WebToApk.getAppIcon();
  names.forEach((n) => addRadio('icon', n, n === current, () => WebToApk.setAppIcon(n)));
}

Periksa jawabannya untuk nama yang tidak dimiliki build:

function pickIcon(name) {
  if (!(window.WebToApk && WebToApk.setAppIcon)) return showMessage('Icons can be changed in the app only');
  if (!WebToApk.setAppIcon(name)) {
    showMessage('Unknown icon "' + name + '". Choose one of: ' + JSON.parse(WebToApk.getAvailableIcons()).join(', '));
  } else {
    showMessage('Done. Your launcher may take a few seconds to redraw the icon.');
  }
}

Catatan: pembaruan pertama yang MENAMBAHKAN ikon alternatif memindahkan entri launcher ke komponen baru, jadi pintasan layar utama yang dibuat sebelum pembaruan itu mungkin harus ditempatkan ulang.

setAppShortcuts jembatan#

window.WebToApk.setAppShortcuts(itemsJson: String)

Pintasan launcher (tekan lama ikon aplikasi). Hingga empat entri: `[{id, title, route}]`, di mana `route` adalah jalur di aplikasi ('/new-note'). Ketukan membuka aplikasi dengan rute itu sebagai tautan dalam peluncurannya (`appmint-shortcut://<package><route>`), yang dibaca halaman lewat `getLaunchUrl()` dan diarahkan persis seperti tautan dalam lainnya. Di aplikasi mode Situs web, shell sendiri membuka rute itu di situs web (`/new-note` → `https://<site>/new-note`). Berikan `[]` untuk menghapusnya. Android 7.1+; tidak berpengaruh di bawah itu.

Contoh

Mengatur pintasan launcher yang muncul saat pengguna menyentuh dan menahan ikon aplikasi.

Mengembalikan: tidak ada. Membutuhkan: tidak ada. Android 7.1+ (tidak berpengaruh di bawah itu).

itemsJson adalah string JSON: array hingga empat objek {id, title, route}. route adalah jalur di dalam aplikasi Anda. Ketukan membuka aplikasi dengan appmint-shortcut://<package><route> sebagai tautan peluncurannya:

if (window.WebToApk && typeof window.WebToApk.setAppShortcuts === 'function') {
  window.WebToApk.setAppShortcuts(JSON.stringify([
    { id: 'new-note', title: 'New note', route: '/new-note' },
    { id: 'search',   title: 'Search',   route: '/search' }
  ]));
}

Baca ketukannya dengan cara yang sama seperti tautan dalam lainnya, saat start dan saat berjalan:

function shortcutRoute(link) {
  var m = /^appmint-shortcut:\/\/[^\/?#]*([^#]*)/i.exec(link || '');
  return m ? (m[1] || '/') : null;
}
if (window.WebToApk && window.WebToApk.getLaunchUrl) {
  var r = shortcutRoute(window.WebToApk.getLaunchUrl());
  if (r) goTo(r);
}
window.addEventListener('appmint:deep-link', function (e) {
  var r = shortcutRoute(e.detail.url);
  if (r) goTo(r);
});

Hapus semua pintasan:

if (window.WebToApk && window.WebToApk.setAppShortcuts) window.WebToApk.setAppShortcuts('[]');

Catatan: Setiap panggilan mengganti seluruh daftar. Entri tanpa title dilewati; label dipotong hingga 25 karakter (50 untuk label panjang). id secara default bernilai appmint-<index>. Rute tanpa / di awal akan diberi satu. Ikonnya adalah ikon aplikasi. Daftar yang salah format diabaikan (dicatat di log), tidak pernah melempar kesalahan. Aplikasi yang dibuat dengan AI dapat memakai shortcuts dari @/lib/appmintNative. Aplikasi mode situs web: ketukan membuka rute di situs web Anda - /new-note memuat https://<your site>/new-note - dan getLaunchUrl() tetap mengembalikan tautan appmint-shortcut://, sehingga halaman yang mengatur rutenya sendiri tetap berfungsi.

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.