JavaScript ब्रिज API
लॉन्च, शॉर्टकट और बैक बटन
ऐप कैसे खोला गया, आइकन पर लंबे दबाव वाले शॉर्टकट, इन-ऐप रिव्यू प्रॉम्प्ट, और शेल को बताना कि पेज को बैक प्रेस चाहिए।
AppMint.requestReview हेल्पर#
AppMint.requestReview(options)
उदाहरण
Google Play से ऐप के अंदर अपनी रेटिंग शीट दिखाने को कहता है (Play In-App Review) और बताता है कि क्या हुआ।
लौटाता है: एक Promise जो हमेशा {result, openedStore, message?} के साथ पूरा होता है। result होता है 'shown' (Play ने अपनी शीट दिखाई - यह कभी नहीं बताता कि यूज़र ने रेट किया या नहीं), 'not_from_play' (यह इंस्टॉल Google Play से नहीं आया: साइडलोड किया APK या टेस्ट इंस्टॉल, जहाँ Play शीट नहीं दिखाता), 'quota' (Play ने अभी दिखाना नहीं चुना: इस यूज़र का कोटा, या वे पहले रिव्यू दे चुके हैं) या 'error' (Play से पूछा नहीं जा सका: Play Store नहीं है, ऑफ़लाइन)। {openStore: true} के साथ, शीट न दिखने पर ऐप की Play लिस्टिंग खुलती है, और openedStore होता है true। ज़रूरत: चालू करने के लिए कुछ नहीं।
कोई भी कोड:
// 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!');
};बटन से नहीं, सफलता के पल के बाद माँगें, ऐप से बाहर भेजे बिना:
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');
}जब क्रिएटर ने Ask users to rate the app (Display चरण) चालू किया हो, तो ऐप किसी शांत पल में खुद पूछता है और पेज को बताता है कि क्या हुआ:
window.addEventListener('appmint:review', function (e) {
// e.detail = { result, openedStore: false, source: 'auto' }
analytics.track('rate_prompt', { result: e.detail.result });
});ध्यान दें: Google Play शीट की दर सीमित करता है और खुद तय करता है कि वह दिखे या नहीं; रिव्यू के बदले कभी इनाम न दें और किसी बटन पर शीट का वादा न करें। इसे Play के इंटरनल-टेस्टिंग ट्रैक वाले इंस्टॉल से टेस्ट करें - साइडलोड किया APK हमेशा यही जवाब देता है not_from_play.
बिना कोड के: appmint://review लिंक। इस पते वाला बटन या लिंक वही शीट माँगता है (और Play जब शीट न दिखाए तो Play लिस्टिंग खोलता है, क्योंकि यूज़र ने रेट करने को कहा था)। इन-ऐप मैसेज में इसे सेंड सेंटर के बटन पर रखें (Rate us टेम्पलेट यही करता है); पेज पर इसे सादे लिंक की तरह इस्तेमाल करें:
<a href="appmint://review" class="rate-link">Rate us on Google Play</a>स्क्रिप्ट से, जैसे तीसरा ऑर्डर पूरा होने के बाद:
function maybeAskForRating(ordersDone) {
if (ordersDone === 3) location.href = 'appmint://review'; // the app runs it; nothing is loaded
}शीट खुलने से पहले सुनें कि यूज़र ने "Rate us" इन-ऐप मैसेज में क्या चुना:
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 हेल्पर#
AppMint.setBackHandler(handler)
उदाहरण
जब यूज़र फ़ोन का Back बटन दबाए (या बैक जेस्चर करे) तो आपके पेज को पहले बोलने का मौका देता है। उन ऐप के लिए ज़रूरी जो एलिमेंट दिखाकर और छिपाकर स्क्रीन बदलते हैं, जहाँ Android की हिस्ट्री खाली होती है और Back ऐप से बाहर निकाल देता।
लौटाता है: कुछ नहीं। आपका handler true (संभाल लिया, यहीं रहें) या false (ऐप को पीछे जाने / बाहर निकलने दें) लौटाए। ज़रूरत: कुछ नहीं। डॉक्यूमेंट के शुरू में इंस्टॉल होता है, इसलिए इसे अपनी पहली स्क्रिप्ट में रजिस्टर कर सकते हैं।
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 इवेंट - रद्द किया जा सकने वाला। प्रेस को खत्म करने के लिए e.preventDefault() बुलाएँ। यह हैंडलर से पहले चलता है, और कितने भी लिसनर इसे इस्तेमाल कर सकते हैं:
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
}
});अधूरे लिखे नोट को खोने से बचाएँ: Back दबाने पर बाहर जाने के बजाय आपका अपना "Discard changes?" बार दिखे (ब्लॉक करने वाला confirm() 350 ms की जवाब-खिड़की चूक जाएगा, इसलिए शेल फिर भी पीछे चला जाएगा):
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();
};
}ध्यान दें: जवाब तुरंत का होना चाहिए: Promise लौटाना "संभाला नहीं गया" गिना जाता है। जल्दी जवाब दें - अगर पेज करीब 350 ms में जवाब नहीं देता, तो शेल खुद पीछे चला जाता है। हर प्रेस पर क्रम: खुला साइड मेन्यू (ऐप का अपना ड्रॉअर) पहले बंद होता है और पेज से पूछा नहीं जाता; फिर appmint:back लिसनर → आपका हैंडलर → शेल का बिल्ट-इन डायलॉग क्लोज़र (यह खुला <dialog>, ARIA डायलॉग या फ़ुल-स्क्रीन मोडल बंद करता है) → हिस्ट्री में पीछे / बाहर निकलने की पुष्टि / बाहर निकलना। जो ऐप हर स्क्रीन के लिए history.pushState इस्तेमाल करते हैं (React Router और ऐसे ही) उन्हें इसकी ज़रूरत नहीं। AI से बने ऐप इसे इस्तेमाल कर सकते हैं onBackGesture से @/lib/appmintNative.
__pullRefreshEligible ब्रिज#
window.WebToApk.__pullRefreshEligible(eligible: Boolean)
देखें [pullPageEligible] / [pullProbeJs]। हर touchstart पर बुलाया जाता है।
उदाहरण
pull-to-refresh के पीछे की अंदरूनी प्लंबिंग: शेल का अपना टच प्रोब इसे हर टच पर बुलाता है यह बताने के लिए कि वहाँ नीचे की ओर खिंचाव से पेज रीफ़्रेश होना चाहिए या नहीं। पेज इसे कभी नहीं बुलाते - वे pull-to-refresh को मानक CSS और टच इवेंट से कंट्रोल करते हैं।
लौटाता है: कुछ नहीं। ज़रूरत: बिल्ड करते समय चरण 3 (Integrate) में Display Options के नीचे Enable Pull-to-Refresh चालू हो (इसके बिना प्रोब इंस्टॉल नहीं होता)।
अपने पेज के किसी हिस्से में खिंचाव को रीफ़्रेश करने से रोकने का सार्वजनिक तरीका - जेस्चर पर दावा करें:
<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>या इसे टच हैंडलर से माँगें, मानक तरीका:
document.getElementById('canvas').addEventListener('touchstart', function (e) {
e.preventDefault(); // the page took this gesture: no pull-to-refresh
}, { passive: false });सिर्फ़ 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>ध्यान दें: खिंचाव तभी रीफ़्रेश करता है जब उँगली के नीचे का सबसे नज़दीकी स्क्रॉल होने वाला बॉक्स (या पेज खुद) सबसे ऊपर हो, सिर्फ़ एक उँगली नीचे हो, और ऊपर के दावों में से कोई लागू न हो। क्रॉस-ऑरिजिन iframe के अंदर का टच कभी रीफ़्रेश नहीं करता। इस मेथड को खुद न बुलाएँ।
getAppIcon ब्रिज#
window.WebToApk.getAppIcon(): String
इस्तेमाल में आइकन: "default" या getAvailableIcons() के नामों में से एक।
उदाहरण
इस्तेमाल में लॉन्चर आइकन: 'default' या इनमें से कोई नाम getAvailableIcons().
लौटाता है: एक स्ट्रिंग। वैकल्पिक आइकन के बिना बिल्ड में '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);
});
}सेटिंग्स स्क्रीन से अगले आइकन पर जाएँ:
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.');
}आइकन का नाम लेबल में दिखाएँ, या ऐप के बाहर छिपाएँ:
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 ब्रिज#
window.WebToApk.getAvailableIcons(): String
उन आइकन नामों का JSON ऐरे जो setAppIcon मानता है: पहले "default", फिर बिल्ड के वैकल्पिक।
उदाहरण
setAppIcon जो आइकन नाम मानता है, JSON ऐरे स्ट्रिंग के रूप में: पहले 'default', फिर बिल्ड विज़ार्ड के वैकल्पिक आइकन उसी क्रम में जिसमें आपने जोड़े।
लौटाता है: '["default","Dark","Gold"]', या वैकल्पिक आइकन के बिना बिल्ड में '["default"]'।
आइकन पिकर बनाएँ:
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'));वैकल्पिक आइकन के बिना बिल्ड में पिकर छिपाएँ:
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थीम के साथ आइकन बदलें:
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 ब्रिज#
window.WebToApk.getLaunchUrl(): String
वह डीप लिंक जिसने इस ऐप को लॉन्च या दोबारा शुरू किया, या "" अगर इसे सामान्य तरीके से खोला गया। जब भी आपका ऐप माउंट हो इसे पढ़ें और खुद उस पर रूट करें: const u = window.WebToApk?.getLaunchUrl?.(); if (u) router.navigate(new URL(u).pathname); वैल्यू रखी रहती है, इस्तेमाल होकर हटती नहीं, इसलिए देर से माउंट होने वाला ऐप भी इसे देख लेता है; ऐप चलते समय आने वाला अगला लिंक इसे बदल देता है और साथ ही यह भी चलाता है 'appmint:deep-link'.
उदाहरण
वह डीप लिंक जिसने ऐप खोला (या दोबारा खोला), एक स्ट्रिंग के रूप में, या ऐप सामान्य तरीके से खुलने पर ""।
लौटाता है: एक स्ट्रिंग, तुरंत। ज़रूरत: कुछ नहीं। वैल्यू रखी रहती है, हटती नहीं, इसलिए आपका ऐप जब भी माउंट हो इसे पढ़ना सुरक्षित है।
लिंक तीन रूपों में आ सकता है: https://yoursite.com/path, शेल का अपना appmint-shortcut://<package>/<route> (लॉन्चर शॉर्टकट, होम-स्क्रीन विजेट), या आपकी अपनी स्कीम myapp://segment/path। यह हेल्पर तीनों को एक रूट में बदल देता है:
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 }
});वही घोषणा एक ग्लोबल हुक को भी दी जाती है, अगर आप उसे पसंद करें:
window.onAppMintDeepLink = function (detail) { goTo(routeOf(detail.url)); };https://yoursite.com/invite?code=AB12 या myapp://invite?code=AB12 जैसे लिंक से रेफ़रल कोड पढ़ें, हर लिंक पर एक बार (यह ऊपर वाला routeOf इस्तेमाल करता है):
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); });
}ध्यान दें: जब तक लिंक रखा है, appmint:deep-link हर पेज लोड के बाद भी चलता है, इसलिए वही url एक से ज़्यादा बार आ सकता है। जो लिंक आप संभाल चुके हैं उसे अनदेखा करें।
वेबसाइट-मोड ऐप अलग हैं: शेल खुद आने वाले https:// लिंक को लोड करता है (कोल्ड स्टार्ट पर और चलते समय), और कस्टम-स्कीम लिंक myapp://product/42 पहले आपकी साइट के पते (https://yoursite.com/product/42) पर बदला जाता है, इसलिए getLaunchUrl() https:// वाला रूप लौटाता है और आपके पेज को आमतौर पर रूट करने को कुछ नहीं होता। लॉन्चर शॉर्टकट या विजेट टैप वेबसाइट-मोड पेज तक पहुँचता ही नहीं (देखें setAppShortcuts)। HTML, ZIP और AI से बने ऐप में (जो ऐप के अंदर से चलते हैं) शेल कभी नेविगेट नहीं करता: आपका पेज लिंक पाता है और उस पर रूट करता है। कस्टम-स्कीम लिंक वहाँ जैसा आया वैसा ही रहता है, क्योंकि उसे जोड़ने के लिए कोई साइट पता नहीं है। AI से बने ऐप इसे इस्तेमाल कर सकते हैं launchUrl() से @/lib/appmintNative.
rateApp ब्रिज#
window.WebToApk.rateApp(): String
Play लिस्टिंग का रेटिंग फ़्लो खोलता है। `rateApp()` पहले से था, पर उस तक सिर्फ़ नेटिव ड्रॉअर की एंट्री पहुँच सकती थी, इसलिए जो ऐप अपना UI खुद बनाता है - हर AI बिल्ड, जहाँ ड्रॉअर बंद है - उसके पास रेटिंग माँगने का कोई तरीका नहीं था। यह अकेली स्टोर कार्रवाई है जो पेज सचमुच खुद नहीं कर सकता: `market://` एक इंटेंट है, नेविगेट होने वाला URL नहीं। यह क्रिएटर के अपने "Rate App Button" स्विच पर निर्भर है, ठीक ड्रॉअर एंट्री और बॉटम-नेव के Share आइटम की तरह: Rate बंद करने का मतलब कहीं भी रेटिंग की जगह नहीं होना चाहिए, वरना स्विच टूटा हुआ लगेगा।
उदाहरण
ऐप का Google Play पेज खोलता है ताकि यूज़र उसे रेट कर सके।
लौटाता है: लिस्टिंग खुलने पर 'opened', क्रिएटर के Rate App बंद करने पर 'off' (तब कुछ नहीं होता)। ज़रूरत: बिल्ड करते समय चरण 5 (Menu) में Rate App Button स्विच (यह डिफ़ॉल्ट रूप से चालू है; यह साइड मेन्यू में "Rate App" आइटम भी जोड़ता है)। इसके बंद होने पर कॉल कुछ नहीं करती और 'off' लौटाती है। Google Play की इन-ऐप रेटिंग शीट के लिए इस्तेमाल करें 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
}रेटिंग एक ही बार माँगें, जब यूज़र पाँच वर्कआउट पूरे कर ले, किसी ऐसे कार्ड से जिसे वह टैप करे:
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; };
}आपकी सेटिंग्स स्क्रीन पर "Rate us" पंक्ति जो यूज़र के Google Play से लौटने पर धन्यवाद कहती है (पेज का फ़ोरग्राउंड में लौटना ही इकलौता संकेत है कि यूज़र लौट आया):
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
});
};ध्यान दें: यह Play Store लिस्टिंग (market://details?id=<package>) खोलता है, या Play Store ऐप न होने पर Play की वेबसाइट। यह इन-ऐप रिव्यू कार्ड नहीं है। पेज खुद market:// नहीं खोल सकता - यह Android इंटेंट है, वेब पता नहीं। सिर्फ़ तभी माँगें जब यूज़र ने कुछ ऐसा किया हो जो उसे पसंद आया, और टैप से।
requestReview ब्रिज#
window.WebToApk.requestReview(optionsJson: String, callbackId: String)
Play से उसकी रिव्यू शीट माँगता है; [optionsJson] `{openStore?}`। [callbackId] पर AppMint.requestReview पूरा करता है।
उदाहरण
AppMint.requestReview() के पीछे की अंदरूनी प्लंबिंग - पेज उस Promise हेल्पर को इस्तेमाल करते हैं, जो Google Play से उसकी इन-ऐप रिव्यू शीट माँगता है और जो हुआ उसके साथ पूरा होता है।
लौटाता है: सीधे कुछ नहीं; नतीजा AppMint.requestReview() promise को पूरा करता है। ज़रूरत: चालू करने के लिए कुछ नहीं। शीट सिर्फ़ Google Play से इंस्टॉल हुए ऐप के लिए दिखती है।
पब्लिक 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'
}अच्छे पल के बाद माँगें, और शीट न दिखे तो स्टोर पेज खोलने को कहें:
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');
}अपने-आप आने वाले प्रॉम्प्ट को सुनें और त्रुटि बताएँ:
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 ब्रिज#
window.WebToApk.setAppIcon(name: String): Boolean
ऐप का लॉन्चर आइकन बिल्ड विज़ार्ड में जोड़े गए वैकल्पिक आइकन में से एक में बदलता है, वहाँ दिए गए नाम से ("default" = सामान्य आइकन)। इस बिल्ड में जो नाम नहीं है उसके लिए false लौटाता है। लॉन्चर अपने समय पर रीड्रॉ करता है (कुछ फ़ोन पर कुछ सेकंड), और कुछ लॉन्चर बदलने पर ऐप बंद कर देते हैं या उसका होम-स्क्रीन आइकन हटा देते हैं - इसे सेटिंग्स स्क्रीन से बदलें, किसी काम के बीच में नहीं।
उदाहरण
ऐप का लॉन्चर आइकन उन वैकल्पिक आइकन में से एक में बदलता है जो आपने बिल्ड विज़ार्ड (Basic चरण, "Alternate app icons") में जोड़े, वहाँ दिए गए नाम से। 'default' आपका सामान्य आइकन है।
लौटाता है: बदलाव हो जाने पर (या वही आइकन पहले से हो) true, इस बिल्ड में जो नाम नहीं है उसके लिए false। ज़रूरत: विज़ार्ड में जोड़े गए वैकल्पिक आइकन (4 तक)। कुछ लॉन्चर आइकन रीड्रॉ करने में कुछ सेकंड लेते हैं, और कुछ बदलने पर ऐप बंद कर देते हैं या उसका होम-स्क्रीन शॉर्टकट हटा देते हैं: इसे सेटिंग्स स्क्रीन से बदलें, किसी काम के बीच में नहीं। आपके लॉन्चर शॉर्टकट (setAppShortcuts) नए आइकन के साथ अपने-आप दोबारा प्रकाशित हो जाते हैं।
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'));इस बिल्ड में मौजूद आइकन से पिकर बनाएँ:
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)));
}ऐसे नाम के लिए जवाब जाँचें जो बिल्ड में नहीं है:
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.');
}
}ध्यान दें: वैकल्पिक आइकन जोड़ने वाला पहला अपडेट लॉन्चर एंट्री को नए कंपोनेंट पर ले जाता है, इसलिए उस अपडेट से पहले बनाए गए होम-स्क्रीन शॉर्टकट को दोबारा रखना पड़ सकता है।
setAppShortcuts ब्रिज#
window.WebToApk.setAppShortcuts(itemsJson: String)
लॉन्चर शॉर्टकट (ऐप आइकन पर लंबा दबाव)। चार तक एंट्री: `[{id, title, route}]`, जहाँ `route` ऐप के अंदर का पाथ है ('/new-note')। टैप करने पर ऐप उस रूट को अपने लॉन्च डीप लिंक (`appmint-shortcut://<package><route>`) के रूप में लेकर खुलता है, जिसे पेज `getLaunchUrl()` से पढ़ता है और किसी भी दूसरे डीप लिंक की तरह उसी पर रूट करता है। वेबसाइट-मोड ऐप में शेल खुद रूट को वेबसाइट पर खोलता है (`/new-note` → `https://<site>/new-note`)। उन्हें हटाने के लिए `[]` दें। Android 7.1+; उससे नीचे कुछ नहीं होता।
उदाहरण
वे लॉन्चर शॉर्टकट सेट करता है जो यूज़र के ऐप आइकन को छूकर दबाए रखने पर दिखते हैं।
लौटाता है: कुछ नहीं। ज़रूरत: कुछ नहीं। Android 7.1+ (उससे नीचे कुछ नहीं होता)।
itemsJson एक JSON स्ट्रिंग है: चार तक {id, title, route} ऑब्जेक्ट का ऐरे। route आपके ऐप के अंदर का पाथ है। टैप करने पर ऐप appmint-shortcut://<package><route> को अपने लॉन्च लिंक के रूप में लेकर खुलता है:
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' }
]));
}टैप को किसी भी दूसरे डीप लिंक की तरह पढ़ें, शुरू होते समय और चलते समय:
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);
});सभी शॉर्टकट हटाएँ:
if (window.WebToApk && window.WebToApk.setAppShortcuts) window.WebToApk.setAppShortcuts('[]');ध्यान दें: हर कॉल पूरी सूची बदल देती है। बिना title वाली एंट्री छोड़ दी जाती हैं; लेबल 25 अक्षरों पर कट जाता है (लंबे लेबल के लिए 50)। id का डिफ़ॉल्ट appmint-<index> है। बिना शुरुआती / वाले रूट में एक जुड़ जाता है। आइकन ऐप आइकन है। गलत बनी सूची अनदेखी की जाती है (लॉग होती है), कभी एरर नहीं फेंकती। AI से बने ऐप इसे @/lib/appmintNative से shortcuts के रूप में इस्तेमाल कर सकते हैं। वेबसाइट-मोड ऐप: टैप रूट को आपकी वेबसाइट पर खोलता है - /new-note https://<your site>/new-note लोड करता है - और getLaunchUrl() फिर भी appmint-shortcut:// लिंक लौटाता है, इसलिए जो पेज खुद रूट करता है वह चलता रहता है।