Ücretsiz APK oluştur

JavaScript köprü API'si

Başlatma, kısayollar ve geri düğmesi

Uygulamanın nasıl açıldığı, simgedeki uzun basış kısayolları, uygulama içi değerlendirme istemi ve kabuğa sayfanın geri tuşunu istediğini söyleme.

AppMint.requestReview yardımcı#

AppMint.requestReview(options)

Örnek

Google Play'den uygulama içinde kendi puanlama sayfasını (Play In-App Review) göstermesini ister ve size ne olduğunu söyler.

DΓΆner deΔer: her zaman Γ§ΓΆzΓΌlen bir Promise {result, openedStore, message?}. result Εunlardan biridir: 'shown' (Play deΔerlendirme sayfasΔ±nΔ± gΓΆsterdi β kullanΔ±cΔ±nΔ±n puan verip vermediΔini asla sΓΆylemez), 'not_from_play' (bu kurulum Google Play'den gelmedi: yΓΌklenmiΕ bir APK veya test kurulumu, Play'in sayfayΔ± hiΓ§ gΓΆstermediΔi durum), 'quota' (Play sayfayΔ± Εimdilik gΓΆstermemeyi seΓ§ti: bu kullanΔ±cΔ± iΓ§in kotasΔ± doldu veya kullanΔ±cΔ± zaten deΔerlendirdi) veya 'error' (Play'e sorulamadΔ±: Play Store yok, Γ§evrimdΕ±ΕΔ±). {openStore: true} ile sayfa gΓΆsterilmezse uygulamanΔ±n Play sayfasΔ± aΓ§Δ±lΔ±r ve openedStore true olur. Gerekenler: aΓ§Δ±lacak bir Εey yok.

Herhangi bir kod:

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

Uygulamadan hiç çıkmadan, bir düğme yerine bir başarı anından sonra sorun:

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

Oluşturucu Kullanıcılardan uygulamayı puanlamalarını iste seçeneğini (Görüntü adımı) açtığında, uygulama sakin bir anda kendiliğinden sorar ve sayfaya ne olduğunu bildirir:

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

Notlar: Google Play sayfayı hız sınırlar ve görünüp görünmeyeceğine kendisi karar verir; bir yorumu asla ödüllendirmeyin ve bir düğmeyle sayfayı vaat etmeyin. Play'den dahili test kanalıyla yapılan bir kurulumla deneyin - yan yüklenen bir APK her zaman şunu yanıtlar not_from_play.

Kodsuz: appmint://review bağlantısı. Bu adrese sahip bir düğme veya bağlantı aynı sayfayı ister (Play göstermeyecekse kullanıcı puan vermek istediği için Play sayfasını da açar). Bir uygulama içi mesajda, gönderim merkezinde bir düğmeye koyun (Bizi puanla şablonu koyar); bir sayfada düz bağlantı olarak kullanın:

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

Betikten, örneğin üçüncü tamamlanmış siparişten sonra:

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

Sayfa açılmadan önce bir "Bizi puanla" uygulama içi mesajında kullanıcının ne seçtiğini duyun:

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 yardımcı#

AppMint.setBackHandler(handler)

Örnek

Kullanıcı telefonun Geri düğmesine bastığında (veya geri hareketini kullandığında) sayfanıza ilk söz hakkını verir. Ekranları öğeleri göstererek ve gizleyerek değiştiren, Android geçmişinin boş olduğu ve Geri'nin uygulamadan çıkaracağı uygulamalar için gereklidir.

Döndürür: hiçbir şey. handler işleyiciniz true (işlendi, burada kal) veya false (uygulama geri gitsin / çıksın) döndürmelidir. Gerekenler: hiçbir şey. Belge başlangıcında kurulur, bu yüzden ilk betiğinizde kaydedebilirsiniz.

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

appmint:back olayı - iptal edilebilir. Basışı tüketmek için e.preventDefault() çağırın. İşleyiciden önce çalışır ve istenen sayıda dinleyici kullanabilir:

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

Yarım yazılmış bir notun kaybolmasını önleyin: Geri, ayrılmak yerine kendi "Değişiklikler silinsin mi?" çubuğunuzu gösterir (engelleyen bir confirm() 350 ms yanıt penceresini kaçırır, yani kabuk yine de geri giderdi):

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

Notlar: Yanıt eşzamanlı olmalıdır: bir Promise döndürmek "işlenmedi" sayılır. Hızlı yanıtlayın - sayfa yaklaşık 350 ms içinde yanıt vermezse kabuk kendiliğinden geri gider. Her basışta sıra: açık bir yan menü (uygulamanın kendi çekmecesi) önce kapanır ve sayfaya sorulmaz; sonra appmint:back dinleyicileri → işleyiciniz → kabuğun yerleşik pencere kapatıcısı (açık bir <dialog>, ARIA penceresi veya tam ekran modal kapatır) → geçmişte geri / çıkış onayı / çıkış. Her ekran için history.pushState kullanan uygulamaların (React Router ve benzerleri) buna ihtiyacı yoktur. Yapay zekâyla oluşturulan uygulamalar onBackGesture kullanabilir, şuradan @/lib/appmintNative.

__pullRefreshEligible köprü#

window.WebToApk.__pullRefreshEligible(eligible: Boolean)

[pullPageEligible] / [pullProbeJs] bölümlerine bakın. Her touchstart'ta çağrılır.

Örnek

Çekerek yenilemenin arkasındaki iç tesisat: kabuğun kendi dokunma sondası, orada aşağı doğru bir çekmenin sayfayı yenileyip yenilemeyeceğini söylemek için her dokunuşta bunu çağırır. Sayfalar bunu asla çağırmaz - çekerek yenilemeyi standart CSS ve dokunma olaylarıyla denetlerler.

Döndürür: hiçbir şey. Gerekenler: derlerken Adım 3'te (Entegre et), Görüntü Seçenekleri altında Çekerek Yenilemeyi Etkinleştir açık olmalı (açık değilse sonda kurulmaz).

SayfanΔ±zΔ±n bir bΓΆlΓΌmΓΌnde aΕaΔΔ± Γ§ekerek yenilemeyi durdurmanΔ±n genel yolu β hareketi sahiplenin:

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

Veya standart yolla bir dokunma işleyicisinden sahiplenin:

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

Dikey sürüklemeleri yalnızca CSS ile sahiplenerek kaydır-ve-yakınlaştır yüzeyinin sayfayı yenilemesini önleyin:

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

Notlar: Bir çekme yalnızca parmağın altındaki en yakın kaydırılabilir kutu (veya sayfanın kendisi) en üste kaydırılmışsa, yalnızca bir parmak basılıysa ve yukarıdaki hak taleplerinden hiçbiri geçerli değilse yeniler. Başka kaynaklı bir iframe içindeki dokunuş asla yenilemez. Bu yöntemi kendiniz çağırmayın.

getAppIcon köprü#

window.WebToApk.getAppIcon(): String

Kullanımdaki başlatıcı simgesi: "default" veya getAvailableIcons() içindeki adlardan biri.

Örnek

Kullanımdaki başlatıcı simgesi: 'default' veya şuradaki adlardan biri getAvailableIcons().

Döndürür: bir dize. Alternatif simgesi olmayan bir derlemede 'default'.

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

Bir ayarlar ekranından sonraki simgeye geçin:

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

Simge adını bir etikette gösterin veya uygulama dışında gizleyin:

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 köprü#

window.WebToApk.getAvailableIcons(): String

setAppIcon'un kabul ettiği simge adlarının JSON dizisi: önce "default", sonra derlemenin alternatifleri.

Örnek

setAppIcon öğesinin kabul ettiği simge adları, JSON dizi dizesi olarak: önce 'default', sonra derleme sihirbazındaki alternatif simgeler eklediğiniz sırayla.

Döndürür: '["default","Dark","Gold"]', alternatif simgesi olmayan bir derlemede '["default"]'.

Bir simge seçici oluşturun:

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

Alternatif simgesi olmayan bir derlemede seçiciyi gizleyin:

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

Simgeyi temayla birlikte değiştirin:

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 köprü#

window.WebToApk.getLaunchUrl(): String

Bu uygulamayı başlatan veya sürdüren derin bağlantı, normal açıldıysa "". Uygulamanız her bağlandığında okuyun ve kendiniz yönlendirin: const u = window.WebToApk?.getLaunchUrl?.(); if (u) router.navigate(new URL(u).pathname); Değer TUTULUR, tüketilmez, bu yüzden geç bağlanan bir uygulama da görür; uygulama çalışırken gelen sonraki bir bağlantı onun yerini alır ve ayrıca tetikler 'appmint:deep-link'.

Örnek

Uygulamayı açan (veya yeniden açan) derin bağlantı, bir dize olarak; uygulama normal açıldıysa "".

Döndürür: bir dize, eşzamanlı olarak. Gerekenler: hiçbir şey. Değer tutulur, tüketilmez, bu yüzden uygulamanız ne zaman bağlanırsa okumak güvenlidir.

Bir bağlantı üç biçimde gelebilir: https://yoursite.com/path, kabuğun kendi appmint-shortcut://<package>/<route> biçimi (başlatıcı kısayolları, ana ekran widget'ı) veya özel şemanız myapp://segment/path. Bu yardımcı üçünü de bir yola çevirir:

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

Aynı duyuru, tercih ederseniz tek bir genel hook'a da iletilir:

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

https://yoursite.com/invite?code=AB12 veya myapp://invite?code=AB12 gibi bir bağlantıdan, bağlantı başına bir kez bir tavsiye kodu okuyun (yukarıdaki routeOf kullanılır):

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

Notlar: bir baΔlantΔ± tutulduΔu sΓΌrece appmint:deep-link her sayfa yΓΌklemesinden sonra da tetiklenir, bu yΓΌzden aynΔ± url birden fazla kez gelebilir. Zaten iΕlediΔiniz bir baΔlantΔ±yΔ± yok sayΔ±n.

Web sitesi kipindeki uygulamalar farklıdır: kabuğun kendisi gelen bir https:// bağlantısını yükler (soğuk başlatmada ve çalışırken) ve özel şemalı bir bağlantı myapp://product/42 önce sitenizin adresine (https://yoursite.com/product/42) yeniden yazılır, bu yüzden getLaunchUrl() https:// biçimini döndürür ve sayfanızın genellikle yönlendirecek bir şeyi yoktur. Bir başlatıcı kısayolu veya widget dokunuşu rotasını sitenizde açar (/today, https://yoursite.com/today adresini yükler) ve getLaunchUrl() yine appmint-shortcut:// biçimini döndürür (bkz. setAppShortcuts). HTML, ZIP ve yapay zekâyla oluşturulan uygulamalarda (uygulamanın içinden sunulan) kabuk asla gezinmez: sayfanız bağlantıyı alır ve ona göre yönlendirir. Özel şemalı bir bağlantı, eşlenecek bir site adresi olmadığı için olduğu gibi kalır. Yapay zekâyla oluşturulan uygulamalar launchUrl() kullanabilir, şuradan @/lib/appmintNative.

rateApp köprü#

window.WebToApk.rateApp(): String

Play sayfasının puanlama akışını açar. `rateApp()` zaten vardı ama yalnızca yerel çekmece girişi ona ulaşabiliyordu; bu yüzden kendi arayüzünü çizen bir uygulama - çekmecenin kapalı olduğu her yapay zekâ derlemesi - puan isteme yolu bulamıyordu. Bir sayfanın kendi başına yapamayacağı tek mağaza eylemidir: `market://` bir intent'tir, gezinilebilir bir URL değil. Oluşturucunun kendi "Uygulamayı Puanla Düğmesi" anahtarına bağlıdır, tıpkı çekmece girişi ve alt gezinme Paylaş öğesi gibi: Puanla'yı kapatmak hiçbir yerde puanlama yüzeyi olmaması demek olmalı, yoksa anahtar bozuk görünür.

Örnek

KullanΔ±cΔ± puan verebilsin diye uygulamanΔ±n Google Play sayfasΔ±nΔ± aΓ§ar.

Döndürür: sayfa açıldığında 'opened', oluşturucu Uygulamayı Puanla'yı kapattığında 'off' (o zaman hiçbir şey olmaz). Gerekenler: derlerken Adım 5'teki (Menü) Uygulamayı Puanla Düğmesi anahtarı (varsayılan olarak açıktır; ayrıca yan menüye "Uygulamayı Puanla" öğesi ekler). Kapalıyken çağrı hiçbir şey yapmaz ve 'off' döndürür. Google Play'in uygulama içi puanlama sayfası için şunu kullanın 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
}

Puanlamayı bir kez, kullanıcı beş antrenmanı bitirdikten sonra, dokunduğu bir karttan sunun:

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

Ayarlar ekranınızda, kullanıcı Google Play'den döndüğünde teşekkür eden bir "Bizi puanla" satırı (sayfanın ön plana dönmesi, kullanıcının geri geldiğinin tek sinyalidir):

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

Notlar: Play Store sayfasΔ±nΔ± (market://details?id=<package>) aΓ§ar; Play Store uygulamasΔ± yoksa Play web sitesini aΓ§ar. Uygulama iΓ§i deΔerlendirme kartΔ± deΔildir. Bir sayfa market:// adresini kendisi aΓ§amaz β bu bir Android intent'idir, web adresi deΔil. YalnΔ±zca kullanΔ±cΔ± beΔendiΔi bir Εey yaptΔ±ktan sonra ve bir dokunuΕtan sonra isteyin.

requestReview köprü#

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

Play'den deΔerlendirme sayfasΔ±nΔ± ister; [optionsJson] `{openStore?}`. [callbackId] ile AppMint.requestReview Γ§ΓΆzΓΌlΓΌr.

Örnek

AppMint.requestReview() arkasındaki iç tesisat - sayfalar bu Promise yardımcısını kullanır; o, Google Play'den uygulama içi değerlendirme sayfasını ister ve ne olduğuyla çözülür.

Döndürür: doğrudan hiçbir şey; sonuç AppMint.requestReview() promise'ini çözer. Gerekenler: açılacak bir şey yok. Sayfa yalnızca Google Play'den kurulan bir uygulamada görünür.

Genel API:

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

İyi bir andan sonra sorun ve sayfa görünmediğinde mağaza sayfasını isteyin:

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

Otomatik istemi dinleyin ve bir hatayı bildirin:

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 köprü#

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

Uygulamanın başlatıcı simgesini, derleme sihirbazında orada verilen adla eklenen alternatif simgelerden birine değiştirir ("default" = normal simge). Bu derlemede olmayan bir ad için false döndürür. Başlatıcı kendi zamanında yeniden çizer (bazı telefonlarda birkaç saniye) ve bazı başlatıcılar değiştiğinde uygulamayı kapatır veya ana ekran simgesini taşır - bir görevin ortasında değil, bir ayarlar ekranından değiştirin.

Örnek

Uygulamanın başlatıcı simgesini, derleme sihirbazında (Temel adım, "Alternatif uygulama simgeleri") eklediğiniz alternatif simgelerden birine, orada verdiğiniz adla değiştirir. 'default' normal simgenizdir.

Döndürür: geçiş yapıldığında (veya zaten o simge olduğunda) true, bu derlemede olmayan bir ad için false. Gerekenler: sihirbazda eklenmiş alternatif simgeler (en çok 4). Bazı başlatıcılar simgeyi yeniden çizmek için birkaç saniye alır ve birkaçı değiştiğinde uygulamayı kapatır veya ana ekran kısayolunu taşır: bir görevin ortasında değil, bir ayarlar ekranından değiştirin. Başlatıcı kısayollarınız (setAppShortcuts) yeni simge altında otomatik olarak yeniden yayınlanır.

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

Seçiciyi bu derlemede bulunan simgelerden oluşturun:

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

Derlemede olmayan bir ad için yanıtı kontrol edin:

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

Notlar: alternatif simge EKLEYEN ilk güncelleme başlatıcı girişini yeni bir bileşene taşır; bu yüzden o güncellemeden önce yapılan bir ana ekran kısayolunun yeniden yerleştirilmesi gerekebilir.

setAppShortcuts köprü#

window.WebToApk.setAppShortcuts(itemsJson: String)

Başlatıcı kısayolları (uygulama simgesine uzun basın). En çok dört girdi: `[{id, title, route}]`, burada `route` uygulamadaki bir yoldur ('/new-note'). Bir dokunuş uygulamayı o rotayla başlatma derin bağlantısı olarak açar (`appmint-shortcut://<package><route>`); sayfa bunu `getLaunchUrl()` ile okur ve diğer derin bağlantılar gibi yönlendirir. Web sitesi kipindeki bir uygulamada kabuk rotayı web sitesinde açar (`/new-note` → `https://<site>/new-note`). Kaldırmak için `[]` verin. Android 7.1+; altında etkisiz.

Örnek

Kullanıcı uygulama simgesine dokunup basılı tuttuğunda görünen başlatıcı kısayollarını ayarlar.

Döndürür: hiçbir şey. Gerekenler: hiçbir şey. Android 7.1+ (altında etkisiz).

itemsJson bir JSON dizesidir: en çok dört {id, title, route} nesnesinden oluşan bir dizi. route, uygulamanızın içindeki bir yoldur. Bir dokunuş uygulamayı appmint-shortcut://<package><route> başlatma bağlantısıyla açar:

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

Dokunuşu diğer derin bağlantılarla aynı şekilde, açılışta ve çalışırken okuyun:

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

Tüm kısayolları kaldırın:

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

Notlar: Her Γ§aΔrΔ± tΓΌm listeyi deΔiΕtirir. title olmayan girdiler atlanΔ±r; etiket 25 karaktere (uzun etiket iΓ§in 50) kesilir. id varsayΔ±lan olarak appmint-<index> olur. BaΕΔ±nda / olmayan bir rotaya bu eklenir. Simge, uygulama simgesidir. Bozuk bir liste yok sayΔ±lΔ±r (kaydedilir), hata fΔ±rlatΔ±lmaz. Yapay zekΓ’yla oluΕturulan uygulamalar shortcuts ΓΆzelliΔini @/lib/appmintNative iΓ§inden kullanabilir. Web sitesi modundaki uygulamalar: bir dokunuΕ rotayΔ± web sitenizde aΓ§ar β /new-note, https://<your site>/new-note adresini yΓΌkler β ve getLaunchUrl() yine appmint-shortcut:// baΔlantΔ±sΔ±nΔ± dΓΆndΓΌrΓΌr; bΓΆylece kendi rotasΔ±nΔ± yΓΆnetenb bir sayfa Γ§alΔ±Εmaya devam eder.

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

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