Créer un APK gratuit

API du pont JavaScript

Lancement, raccourcis et bouton Retour

Comment l'application a été ouverte, raccourcis par appui long sur l'icÎne, invite d'avis dans l'application, et indiquer au shell que la page veut l'appui sur Retour.

AppMint.requestReview assistant#

AppMint.requestReview(options)

Exemple

Demande à Google Play d'afficher sa propre feuille de notation dans l'application (Play In-App Review) et vous dit ce qui s'est passé.

Retourne : une Promise qui se résout toujours {result, openedStore, message?}. result vaut 'shown' (Play a affiché sa fenêtre - il ne dit jamais si l'utilisateur a noté), 'not_from_play' (cette installation ne vient pas de Google Play : APK installé manuellement ou installation de test, où Play n'affiche jamais la fenêtre), 'quota' (Play a choisi de ne pas l'afficher maintenant : son quota pour cet utilisateur est atteint, ou il a déjà donné son avis) ou 'error' (Play n'a pas pu être interrogé : pas de Play Store, hors ligne). Avec {openStore: true}, la fiche Play de l'application s'ouvre quand la fenêtre ne s'est pas affichée, et openedStore vaut true. Nécessite : rien à activer.

N'importe quel code :

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

Demandez aprÚs un moment de réussite plutÎt que depuis un bouton, sans jamais quitter l'application :

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

Quand le crĂ©ateur a activĂ© Ask users to rate the app (Ă©tape Display), l'application demande d'elle-mĂȘme Ă un moment calme et indique Ă la page ce qui s'est passĂ© :

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

Remarques : Google Play limite la fréquence de la feuille et décide lui-mĂȘme si elle apparaßt ; ne récompensez jamais un avis et ne promettez jamais la feuille sur un bouton. Testez-la avec une installation depuis une piste de test interne de Play - un APK installé hors Play répond toujours not_from_play.

Sans code : le lien appmint://review. Un bouton ou un lien avec cette adresse demande la mĂȘme feuille (et ouvre la fiche Play quand Play ne l'affichera pas, car l'utilisateur a demandĂ© Ă noter). Dans un message intĂ©grĂ©, mettez-le sur un bouton dans le centre d'envoi (le modĂšle Rate us le fait) ; sur une page, utilisez-le comme simple lien :

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

Depuis un script, par exemple aprÚs la troisiÚme commande terminée :

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

Sachez ce que l'utilisateur a choisi dans un message intĂ©grĂ© « Notez-nous » avant l'ouverture de la feuille :

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

AppMint.setBackHandler(handler)

Exemple

Donne Ă votre page le premier mot quand l'utilisateur appuie sur le bouton Retour du tĂ©lĂ©phone (ou utilise le geste de retour). NĂ©cessaire aux applications qui changent d'Ă©cran en affichant et masquant des Ă©lĂ©ments, oĂč l'historique d'Android est vide et oĂč Retour quitterait l'application.

Renvoie : rien. Votre handler doit renvoyer true (géré, restez ici) ou false (laissez l'application revenir en arriÚre / quitter). Nécessite : rien. Installé au début du document, vous pouvez donc l'enregistrer dans votre premier script.

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

L'événement appmint:back - annulable. Appelez e.preventDefault() pour consommer l'appui. Il s'exécute avant le gestionnaire, et n'importe quel nombre d'écouteurs peut l'utiliser :

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

Évitez de perdre une note Ă moitiĂ© Ă©crite : Retour affiche votre propre barre « Abandonner les modifications ? » au lieu de quitter (un confirm() bloquant manquerait la fenĂȘtre de rĂ©ponse de 350 ms, et le shell reviendrait en arriĂšre quand mĂȘme) :

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

Remarques : la rĂ©ponse doit ĂȘtre synchrone : renvoyer une Promise compte comme « non gĂ©rĂ© ». RĂ©pondez vite - si la page ne rĂ©pond pas en 350 ms environ, le shell revient en arriĂšre de lui-mĂȘme. Ordre Ă chaque appui : un menu latĂ©ral ouvert (le tiroir de l'application) se ferme d'abord et la page n'est pas interrogĂ©e ; puis les Ă©couteurs appmint:back → votre gestionnaire → le fermeur de boĂźtes de dialogue intĂ©grĂ© du shell (il ferme un <dialog> ouvert, une boĂźte de dialogue ARIA ou un modal plein Ă©cran) → retour dans l'historique / confirmation de sortie / sortie. Les applications qui utilisent history.pushState pour chaque Ă©cran (React Router et similaires) n'en ont pas besoin. Les applications créées par IA peuvent utiliser onBackGesture depuis @/lib/appmintNative.

__pullRefreshEligible pont#

window.WebToApk.__pullRefreshEligible(eligible: Boolean)

Voir [pullPageEligible] / [pullProbeJs]. Appelée à chaque touchstart.

Exemple

Mécanique interne derriÚre le pull-to-refresh : la sonde tactile propre au shell l'appelle à chaque toucher pour dire si une traction vers le bas à cet endroit doit actualiser la page. Les pages ne l'appellent jamais - elles contrÎlent le pull-to-refresh avec du CSS standard et des événements tactiles.

Renvoie : rien. Nécessite : Enable Pull-to-Refresh activé à l'étape 3 (Integrate), sous Display Options, lors de la compilation (sans cela, la sonde n'est pas installée).

La méthode publique pour empêcher un tirer-pour-actualiser dans une partie de votre page - revendiquez le geste :

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

Ou revendiquez-le depuis un gestionnaire tactile, de la façon standard :

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

EmpĂȘchez une surface de panoramique et zoom d'actualiser la page en revendiquant les glissements verticaux avec du CSS seul :

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

Remarques : une traction n'actualise que quand la plus proche zone dĂ©filante sous le doigt (ou la page elle-mĂȘme) est tout en haut, qu'un seul doigt est posĂ© et qu'aucune des revendications ci-dessus ne s'applique. Un toucher dans une iframe d'une autre origine n'actualise jamais. N'appelez pas cette mĂ©thode vous-mĂȘme.

getAppIcon pont#

window.WebToApk.getAppIcon(): String

L'icĂŽne de lanceur utilisĂ©e : « default » ou l'un des noms de getAvailableIcons().

Exemple

L'icÎne de lanceur utilisée : 'default' ou l'un des noms de getAvailableIcons().

Renvoie : une chaĂźne. 'default' dans une compilation sans icĂŽnes alternatives.

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

Passez à l'icÎne suivante depuis un écran de paramÚtres :

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

Affichez le nom de l'icÎne dans un libellé, ou masquez-le hors de l'application :

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

window.WebToApk.getAvailableIcons(): String

Tableau JSON des noms d'icĂŽnes acceptĂ©s par setAppIcon : « default » d'abord, puis les alternatives de la compilation.

Exemple

Les noms d'icĂŽnes que setAppIcon accepte, sous forme de chaĂźne de tableau JSON : 'default' d'abord, puis les icĂŽnes alternatives de l'assistant de compilation dans l'ordre oĂč vous les avez ajoutĂ©es.

Renvoie : '["default","Dark","Gold"]', ou '["default"]' dans une compilation sans icĂŽnes alternatives.

Créez un sélecteur d'icÎne :

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

Masquez le sélecteur dans une compilation sans icÎnes alternatives :

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

Changez l'icÎne avec le thÚme :

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

window.WebToApk.getLaunchUrl(): String

Le lien profond qui a lancĂ© ou repris cette application, ou « » si elle a Ă©tĂ© ouverte normalement. Lisez-le Ă chaque montage de votre application et routez vous-mĂȘme dessus : const u = window.WebToApk?.getLaunchUrl?.(); if (u) router.navigate(new URL(u).pathname); La valeur est CONSERVÉE, pas consommĂ©e, donc une application montĂ©e tardivement la voit encore ; un lien ultĂ©rieur arrivant pendant que l'application tourne la remplace et dĂ©clenche aussi 'appmint:deep-link'.

Exemple

Le lien profond qui a ouvert (ou rouvert) l'application, sous forme de chaßne, ou "" quand l'application a été ouverte normalement.

Renvoie : une chaĂźne, de façon synchrone. NĂ©cessite : rien. La valeur est conservĂ©e, pas consommĂ©e, vous pouvez donc la lire sans risque Ă chaque montage de votre application.

Un lien peut arriver sous trois formes : https://yoursite.com/path, le appmint-shortcut://<package>/<route> propre au shell (raccourcis du lanceur, widget de l'écran d'accueil), ou votre schéma personnalisé myapp://segment/path. Cette fonction utilitaire transforme les trois en une route :

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

La mĂȘme annonce est aussi transmise Ă un hook global, si vous en prĂ©fĂ©rez un :

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

Lisez un code de parrainage depuis un lien comme https://yoursite.com/invite?code=AB12 ou myapp://invite?code=AB12, une seule fois par lien (il utilise routeOf ci-dessus) :

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

Remarques : appmint:deep-link est aussi déclenché après chaque chargement de page tant qu'un lien est conservé, donc la même url peut arriver plusieurs fois. Ignorez un lien que vous avez déjà traité.

Les applications en mode Website sont différentes : le shell charge lui-mĂȘme un lien https:// entrant (au dĂ©marrage Ă froid et pendant l'exĂ©cution), et un lien Ă schĂ©ma personnalisĂ© myapp://product/42 est d'abord réécrit sur l'adresse de votre site (https://yoursite.com/product/42), donc getLaunchUrl() renvoie la forme https:// et votre page n'a gĂ©nĂ©ralement rien Ă router. Un raccourci du lanceur ou un appui sur un widget ouvre sa route sur votre site (/today charge https://yoursite.com/today), et getLaunchUrl() renvoie toujours la forme appmint-shortcut:// (voir setAppShortcuts). Dans les applications HTML, ZIP et créées par IA (servies de l'intĂ©rieur de l'application), le shell ne navigue jamais : votre page reçoit le lien et route dessus. Un lien Ă schĂ©ma personnalisĂ© reste tel qu'il est arrivĂ© lĂ , car il n'y a pas d'adresse de site sur laquelle le projeter. Les applications créées par IA peuvent utiliser launchUrl() depuis @/lib/appmintNative.

rateApp pont#

window.WebToApk.rateApp(): String

Ouvre le flux de notation de la fiche Play. `rateApp()` existait dĂ©jĂ mais seule l'entrĂ©e du tiroir natif pouvait l'atteindre, si bien qu'une application qui dessine sa propre interface - toute compilation IA, oĂč le tiroir est dĂ©sactivĂ© - n'avait aucun moyen de demander une note. C'est la seule action de store qu'une page ne peut vraiment pas faire elle-mĂȘme : `market://` est une intention, pas une URL navigable. ConditionnĂ©e Ă l'interrupteur « Rate App Button » du crĂ©ateur, exactement comme l'entrĂ©e du tiroir et l'Ă©lĂ©ment Partager de la navigation du bas : dĂ©sactiver Rate doit signifier aucune surface de notation nulle part, sinon l'interrupteur semble cassĂ©.

Exemple

Ouvre la page Google Play de l'application pour que l'utilisateur puisse la noter.

Renvoie : 'opened' quand la fiche a Ă©tĂ© ouverte, 'off' quand le crĂ©ateur a dĂ©sactivĂ© Rate App (rien ne se passe alors). NĂ©cessite : l'interrupteur Rate App Button Ă l'Ă©tape 5 (Menu) lors de la compilation (activĂ© par dĂ©faut ; il ajoute aussi un Ă©lĂ©ment « Rate App » au menu latĂ©ral). DĂ©sactivĂ©, l'appel ne fait rien et renvoie 'off'. Pour la feuille de notation intĂ©grĂ©e de Google Play, utilisez 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
}

Proposez la notation une seule fois, aprÚs que l'utilisateur a terminé cinq séances, depuis une carte qu'il touche :

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

Une ligne « Notez-nous » sur votre Ă©cran de paramĂštres qui dit merci quand l'utilisateur revient de Google Play (le retour de la page au premier plan est le seul signal que l'utilisateur est revenu) :

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

Remarques : Ouvre la fiche du Play Store (market://details?id=<package>), ou le site web de Play quand l'application Play Store est absente. Ce n'est pas la carte d'avis intégrée à l'application. Une page ne peut pas ouvrir market:// elle-même - c'est un intent Android, pas une adresse web. Ne demandez qu'après une action appréciée de l'utilisateur, et à partir d'un appui.

requestReview pont#

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

Demande à Play sa fenêtre d'avis ; [optionsJson] `{openStore?}`. Résout AppMint.requestReview [callbackId].

Exemple

Mécanique interne derriÚre AppMint.requestReview() - les pages utilisent cette fonction utilitaire Promise, qui demande à Google Play sa feuille d'avis intégrée et résout avec ce qui s'est passé.

Renvoie : rien directement ; le résultat résout la promesse AppMint.requestReview(). Nécessite : rien à activer. La feuille n'apparaßt que pour une application installée depuis Google Play.

L'API publique :

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

Demandez aprÚs un bon moment, et demandez la page du store quand la feuille n'apparaßt pas :

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

Écoutez l'invite automatique et signalez une erreur :

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

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

Change l'icĂŽne de lanceur de l'application pour l'une des icĂŽnes alternatives ajoutĂ©es dans l'assistant de compilation, par le nom donnĂ© lĂ -bas (« default » = l'icĂŽne normale). Renvoie false pour un nom que cette compilation n'a pas. Le lanceur se redessine Ă son rythme (quelques secondes sur certains tĂ©lĂ©phones), et certains lanceurs ferment l'application ou dĂ©placent son icĂŽne d'Ă©cran d'accueil quand elle change - changez depuis un Ă©cran de paramĂštres, pas au milieu d'une tĂąche.

Exemple

Change l'icĂŽne de lanceur de l'application pour l'une des icĂŽnes alternatives que vous avez ajoutĂ©es dans l'assistant de compilation (Ă©tape Basic, « Alternate app icons »), par le nom que vous lui avez donnĂ©. 'default' est votre icĂŽne normale.

Renvoie : true quand le changement a été fait (ou que c'est déjà cette icÎne), false pour un nom que cette compilation n'a pas. Nécessite : des icÎnes alternatives ajoutées dans l'assistant (jusqu'à 4). Certains lanceurs mettent quelques secondes à redessiner l'icÎne, et quelques-uns ferment l'application ou déplacent son raccourci d'écran d'accueil quand elle change : changez depuis un écran de paramÚtres, pas au milieu d'une tùche. Vos raccourcis de lanceur (setAppShortcuts) sont republiés automatiquement sous la nouvelle icÎne.

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

Créez le sélecteur à partir des icÎnes que cette compilation possÚde :

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

Vérifiez la réponse pour un nom que la compilation n'a pas :

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

Remarques : la premiĂšre mise Ă jour qui AJOUTE des icĂŽnes alternatives dĂ©place l'entrĂ©e du lanceur vers un nouveau composant, donc un raccourci d'Ă©cran d'accueil créé avant cette mise Ă jour devra peut-ĂȘtre ĂȘtre replacĂ©.

setAppShortcuts pont#

window.WebToApk.setAppShortcuts(itemsJson: String)

Raccourcis du lanceur (appui long sur l'icĂŽne de l'application). Jusqu'Ă quatre entrĂ©es : `[{id, title, route}]`, oĂč `route` est un chemin dans l'application ('/new-note'). Un appui ouvre l'application avec cette route comme lien profond de lancement (`appmint-shortcut://<package><route>`), que la page lit via `getLaunchUrl()` et sur lequel elle route exactement comme sur tout autre lien profond. Dans une application en mode Website, le shell ouvre lui-mĂȘme la route sur le site web (`/new-note` → `https://<site>/new-note`). Passez `[]` pour les supprimer. Android 7.1+ ; sans effet en dessous.

Exemple

Définit les raccourcis du lanceur qui apparaissent quand l'utilisateur touche et maintient l'icÎne de l'application.

Renvoie : rien. Nécessite : rien. Android 7.1+ (sans effet en dessous).

itemsJson est une chaĂźne JSON : un tableau d'au plus quatre objets {id, title, route}. route est un chemin dans votre application. Un appui ouvre l'application avec appmint-shortcut://<package><route> comme lien de lancement :

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

Lisez l'appui de la mĂȘme façon que tout autre lien profond, au dĂ©marrage et pendant l'exĂ©cution :

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

Supprimez tous les raccourcis :

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

Remarques : Chaque appel remplace toute la liste. Les entrées sans title sont ignorées ; le libellé est coupé à 25 caractères (50 pour le libellé long). id vaut par défaut appmint-<index>. Une route sans / initial en reçoit un. L'icône est celle de l'application. Une liste mal formée est ignorée (consignée), jamais levée comme exception. Les applications créées par IA peuvent utiliser shortcuts depuis @/lib/appmintNative. Applications en mode site web : un appui ouvre la route sur votre site web - /new-note charge https://<your site>/new-note - et getLaunchUrl() renvoie toujours le lien appmint-shortcut://, donc une page qui gère son propre routage continue de fonctionner.

Généré à partir de l'environnement d'exécution de l'application et de ses fichiers d'exemple à chaque compilation de la documentation. Lire en Markdown · Toutes les familles.

Vérifié par rapport au pont publié le 22/10/2026.